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

bio*_*ech 7 awk

echo 'NODE_1_length_317516_cov_18.568_ID_4005' | awk 'FS="_length" {print $1}'
Run Code Online (Sandbox Code Playgroud)

获得的输出:

NODE_1_length_317516_cov_18.568_ID_4005
Run Code Online (Sandbox Code Playgroud)

预期产量:

NODE_1
Run Code Online (Sandbox Code Playgroud)

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

fed*_*qui 10

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

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

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

$ cat file
1,2 3,4
5,6 7,8
Run Code Online (Sandbox Code Playgroud)

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

$ awk '{FS=","} {print $1}' file
1,2                             # FS is still the space!
5
Run Code Online (Sandbox Code Playgroud)

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

$ awk 'BEGIN{FS=","} {print $1}' file
1,2                             # now, FS is the comma
5
$ awk -F, '{print $1}' file
1
5
Run Code Online (Sandbox Code Playgroud)

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

$ awk '{FS=","} {$0=$0;print $1}' file
1
5
Run Code Online (Sandbox Code Playgroud)