我有
$ cat awktestf
a++
b++
c++
我正在做,我得到了
cat awktestf | awk 'BEGIN { RS="++" ; OFS="@"; ORS="()" } { print $0 } END {print "I am done" }'
a()
b()
c()
()I am done()abc@abc:~$
我的问题是为什么我最后得到一个额外的()?
即使这不起作用:
$ echo 'a++
> b++
> c++' | awk 'BEGIN { RS="++" ; OFS="@"; ORS="()" } { print $0 } END {print "I am done" }'
a()
b()
c()
()I am done()abc@abc:~$
答案 0 :(得分:5)
ORS
附加到每个输出记录的末尾。因此,“我完成”以()
结束。
第一次误解了这个问题。
此
a++
b++
c++
转换为
a++\nb++\nc++\n
使用RS
拆分成记录后,您将获得这些记录
当您打印它们时,每条记录都会以ORS
,()
终止,所以
a()\nb()\nc()\n()
您添加了“我已完成”
a()\nb()\nc()\n()I am done()
因此显示为
a()
b()
c()
()I am done()
(由于最后一行不以换行符结束,您的提示显示在同一行上)
答案 1 :(得分:2)
您的文件末尾可能有一个空白行。
由于OFS
设置为()
,因此会在打印到输出的每一行之后打印。只需从输入文件中删除空行即可。
附注:你没有cat
文件然后管道到awk。只需使用awk
:
awk ' .... ' file