我有一个档案
[root@nmk~]# cat file
abc>
sssd>
were>
我运行了awk命令的这些变体
[root@nmk~]# cat file | awk -F\> ' { print $1}' OFS=','
abc
sssd
were
[root@nmk~]# cat file | awk -F\> ' BEGIN { OFS=","} { print $1}'
abc
sssd
were
[root@nmk~]#
但是我的预期输出是
abc,sssd,were
我的命令中缺少什么?
awk中的每一行输入都是一条记录,因此要设置的是输出记录分隔符ORS
。该OFS
变量保存输出字段分隔符,用于分隔每行的不同部分。
既然你是设置输入字段分隔符,FS
到>
和OFS
到,
,一个简单的方法来看到这些作品是如何在后的文件的每一行补充一下>
:
awk 'BEGIN { FS=">"; OFS=","} {$1=$1} 1' <<<$'abc>def\nsssd>dsss\nwere>wolf'
abc,def
sssd,dsss
were,wolf
因此,您要设置ORS。默认的记录分隔符是换行符,因此您设置ORS来有效替换输入中的换行符。但这意味着,如果输入的最后一行包含换行符(通常是这种情况),那么最后一行还将获得新ORS的副本:
awk 'BEGIN { FS=">"; ORS=","} 1' <<<$'abc>def\nsssd>dsss\nwere>wolf'
abc>def,sssd>dsss,were>wolf,
它也根本不会换行,因为该换行被解释为输入记录分隔符,并变成了输出记录分隔符-它成为最后的逗号。
因此,您必须对要执行的操作更加明确:
awk 'BEGIN { FS=">" } # split input on >
(NR>1) { printf "," } # if not the first line, print a ,
{ printf "%s", $1 } # print the first field (everything up to the first >)
END { printf "\n" } # add a newline at the end
' <<<$'abc>\nsssd>\nwere>'
输出以下内容:
abc,sssd,were
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句