我有
$ 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:~$
ORS
附加到每个输出记录的末尾。因此,您的"我已经完成"以()
结束。
第一次误解了这个问题。
这个
a++
b++
c++
转化为
a++nb++nc++n
使用RS
分开记录后,您将获得这些记录
- A
- nb
- nc
- n
打印它们时,每个记录均以ORS
,()
终止,所以
a()nb()nc()n()
您添加了"我已经完成"
a()nb()nc()n()I am done()
因此,这显示为
a()
b()
c()
()I am done()
(由于最后一行并未以newline结束,因此您的提示在同一行上显示)
可能在文件末尾有一个空白。
由于OFS
设置为()
,因此在打印到输出的每条线后将其打印。只需从输入文件中删除空白行。
旁注:您不必cat
文件,然后将管道倒入尴尬。只需使用awk
:
awk ' .... ' file