假设我有这样的文件:
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有什么问题,而且它不是最美丽的解决方案
提前感谢您的帮助。我希望这只是我犯下的这种愚蠢的错误。
答案 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
如果您要使用cat
,grep
和awk
在这里是多余的。 awk
可以自行模式匹配和读取文件:
$ awk '/^[0-9]/{print $0}' file
awk
中的默认阻止是{print $0}
,因此我们也可以删除它:
$ awk '/^[0-9]/' file
由于您只想跳过文件中的第一行,因此更好的解决方案是:
$ awk 'NR>1' file
如果失败,很可能是一个隐藏的角色会发出这样的行结尾。尝试dos2unix file
,看看是否有诀窍或使用十六进制编辑器检查文件。