2

我有

$ 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:~$ 
4

2 回答 2

6

ORS附加到每个输出记录的末尾。因此,您的“我完成了”以().


第一次就误解了这个问题。

a++
b++
c++

翻译成

a++\nb++\nc++\n

使用 拆分为记录后RS,您将获得这些记录

  1. 一种
  2. \nb
  3. \nc
  4. \n

ORS当您打印它们时,每条记录都以,终止(),所以

a()\nb()\nc()\n()

你添加了“我完成了”

a()\nb()\nc()\n()I am done()

因此这显示为

a()
b()
c()
()I am done()

(由于最后一行不以换行符结尾,您的提示将显示在同一行)

于 2012-10-25T23:40:59.657 回答
2

可能您的文件末尾有一个空行。

由于OFS设置为(),它会在打印到输出的每一行之后打印。只需从输入文件中删除空白行。

旁注:您不必cat将文件然后通过管道传输到 awk。只需使用awk

awk ' .... ' file
于 2012-10-25T23:31:09.070 回答