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这似乎与我在这里回答的问题完全不同。如果你能提供足够的细节就更好了!