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

awk字段分隔符不适用于第一行,awk,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 预期产出: echo 'NODE_1_length_317516_cov_18.568_ID_4005' | awk 'FS="_length" {print $1}' NODE_1_length_317516_cov_18.568_ID_4

获得的产量:

echo 'NODE_1_length_317516_cov_18.568_ID_4005' | awk 'FS="_length" {print $1}'
NODE_1_length_317516_cov_18.568_ID_4005
预期产出:

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

这怎么可能?我遗漏了一些东西。

awk语句使用不正确

正确的方法是

NODE_1
在你的情况下,你可以使用

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

内置变量(如FS、ORS等)必须在上下文中设置,即在以下块之一中设置:开始、条件块或结束

awk 'BEGIN { FS = "_length" } ; { print $1 }'
您还可以使用
-F
开关传递分隔符,如下所示:

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

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

这意味着如果在读取记录时设置了
FS
的值,则这对该特定记录无效。相反,
FS
将在读取下一个时生效,依此类推

因此,如果您有这样一个文件:

$ echo 'NODE_1_length_317516_cov_18.568_ID_4005' | awk -F "_length" '{print $1}'
NODE_1
$
如果您在读取一条记录时设置了字段分隔符,它将从下一行开始生效:

$ cat file
1,2 3,4
5,6 7,8
因此,您要做的是在开始读取文件之前设置
FS
。也就是说,在BEGIN块或via参数中设置:

$ awk '{FS=","} {print $1}' file
1,2                             # FS is still the space!
5
还有另一种方法:使用
{$0=$0}
使Awk重新计算完整记录。据此,Awk将考虑当前的
FS
,并相应地采取行动:

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

假设我的第一行是
Cal\u Tno\u V19\u F04\u R02
。如何使用
awk
打印
Cal\u Tno
,即使用分隔符打印前两个字段?@Sigur这似乎与我在这里回答的问题完全不同。如果你能提供足够的细节就更好了!