awk字段分隔符不适用于第一行

时间:2016-04-26 05:04:44

标签: awk

echo 'NODE_1_length_317516_cov_18.568_ID_4005' | awk 'FS="_length" {print $1}'

获得输出:

NODE_1_length_317516_cov_18.568_ID_4005

预期产出:

NODE_1

怎么可能?我错过了什么。

3 个答案:

答案 0 :(得分:9)

当您使用Awk浏览行时,在处理记录之前会解释字段分隔符。 Awk根据FSRS的当前值读取记录,然后继续执行您要求的操作。

这意味着如果您在阅读记录时设置FS的值,则不会对该特定记录产生影响。相反,FS在阅读下一个时会生效。依此类推。

所以,如果您有这样的文件:

$ cat file
1,2 3,4
5,6 7,8

在读取一条记录时设置字段分隔符,它会从下一行生效:

$ awk '{FS=","} {print $1}' file
1,2                             # FS is still the space!
5

所以你要做的是在开始阅读文件之前设置FS。也就是说,将其设置在BEGIN块中或通过参数:

$ awk 'BEGIN{FS=","} {print $1}' file
1,2                             # now, FS is the comma
5
$ awk -F, '{print $1}' file
1
5

还有另一种方法:让Awk用{$0=$0}重新计算完整记录。有了这个,Awk将考虑当前的FS并采取相应行动:

$ awk '{FS=","} {$0=$0;print $1}' file
1
5

答案 1 :(得分:3)

awk语句使用不正确

正确的方法是

awk 'BEGIN { FS = "#{delimiter}" } ; { print $1 }'

在您的情况下,您可以使用

awk 'BEGIN { FS = "_length" } ; { print $1 }'

答案 2 :(得分:0)

FS,ORS等内置变量必须在上下文中设置,即以下块之一:BEGIN,条件块或END。

$ echo 'NODE_1_length_317516_cov_18.568_ID_4005' | awk 'BEGIN{FS="_length"} {print $1}'
NODE_1
$

您还可以使用-F开关传递分隔符,如下所示:

$ echo 'NODE_1_length_317516_cov_18.568_ID_4005' | awk -F "_length" '{print $1}'
NODE_1
$