grep或AWK都在处理已处理流的内容

时间:2013-07-23 11:35:46

标签: bash awk grep

假设我有这样的文件:

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有什么问题,而且它不是最美丽的解决方案

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

1 个答案:

答案 0 :(得分:3)

不使用shell引用可能很危险。除非引用模式csh,否则某些shell(例如^[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

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

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

awk中的默认阻止是{print $0},因此我们也可以删除它:

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

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

$ awk 'NR>1' file

如果失败,很可能是一个隐藏的角色会发出这样的行结尾。尝试dos2unix file,看看是否有诀窍或使用十六进制编辑器检查文件。