0

可以说我有一个这样的文件:

ASI BEK BKG COE
0.00112000003 0.00003000000 -0.00001000000 0.00000000000
0.00170999998 -0.00009000000 -0.00008000000 0.00052000000
0.00089000002 -0.00003000000 -0.00028000001 0.00068000000
0.00031000000 0.00003000000 -0.00026000000 0.00057999999
0.00239000004 -0.00003000000 0.00004000000 0.00076999998
0.00000000000 0.00002000000 -0.00039000000 0.00050000002
0.00401999988 -0.00014000000 -0.00029000000 0.00046000001
0.00179999997 -0.00011000000 -0.00025000001 0.00044000000
0.00025000001 -0.00008000000 0.00004000000 0.00063000002

(显然它更大,记录更长 - 但这个样本足以理解结构)

我只想使用数字开头的记录(省略标题)。所以我显然是这样做的grep ^[0-9]。但 !输出完全没有。因为我通常需要按列使用文件,所以我也使用 AWK。这是下一个奇怪的事情。当我尝试它时,cat file | grep ^[0-9] | awk '{ print }' 它什么也没给我。但是当我在 AWK 中设置明确的列号时(就像awk '{ print $1,$2...<and_so_on>}'它一样。我想避免使用明确的列号,因为我不明白这个 grep 有什么问题,而且它也不是最漂亮的解决方案。

提前感谢您的帮助。我希望这只是我犯的这种愚蠢的错误。

4

1 回答 1

3

不使用 shell 引用可能很危险。除非您引用 pattern ,否则某些 shellcsh不会执行您的想法^[0-9]。您应该在此处使用单引号以确保没有任何内容被解释:

$ cat file | grep '^[0-9]' | awk '{print $0}'
0.00112000003 0.00003000000 -0.00001000000 0.00000000000
0.00170999998 -0.00009000000 -0.00008000000 0.00052000000
0.00089000002 -0.00003000000 -0.00028000001 0.00068000000
0.00031000000 0.00003000000 -0.00026000000 0.00057999999
0.00239000004 -0.00003000000 0.00004000000 0.00076999998
0.00000000000 0.00002000000 -0.00039000000 0.00050000002
0.00401999988 -0.00014000000 -0.00029000000 0.00046000001
0.00179999997 -0.00011000000 -0.00025000001 0.00044000000
0.00025000001 -0.00008000000 0.00004000000 0.00063000002

如果您要使用 , 和 在这里是多余cat的。可以自己进行模式匹配和读取文件:grepawkawk

$ awk '/^[0-9]/{print $0}' file

默认块awk{print $0}这样我们也可以删除它:

$ awk '/^[0-9]/' file

由于您只想跳过文件中的第一行,因此更好的解决方案是:

$ awk 'NR>1' file

失败很可能是隐藏字符问题,例如行尾。尝试dos2unix file看看是否可以解决问题或使用十六进制编辑器检查文件。

于 2013-07-23T11:52:39.487 回答