在awk中使用记录分隔符

时间:2012-10-25 23:22:34

标签: bash shell scripting awk

我有

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

2 个答案:

答案 0 :(得分:5)

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


第一次误解了这个问题。

a++
b++
c++

转换为

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

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

  1. 一个
  2. \ NB
  3. \ NC
  4. \ n
  5. 当您打印它们时,每条记录都会以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