在awk中使用记录分隔符

Ank*_*wal 1 bash shell scripting awk

我有

$ cat awktestf 
a++
b++
c++
Run Code Online (Sandbox Code Playgroud)

我正在做,我得到了

cat  awktestf | awk 'BEGIN { RS="++" ; OFS="@"; ORS="()" } { print $0 } END {print "I am done" }'
a()
b()
c()
()I am done()abc@abc:~$ 
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么我最后得到一个额外的()?

即便这样也行不通:

$ echo 'a++
> b++
> c++' | awk 'BEGIN { RS="++" ; OFS="@"; ORS="()" } { print $0 } END {print "I am done" }'
a()
b()
c()
()I am done()abc@abc:~$ 
Run Code Online (Sandbox Code Playgroud)

dou*_*own 5

ORS被附加到每个输出记录的末尾.因此,你的"我完成了"结束了().


第一次误解了这个问题.

这个

a++
b++
c++
Run Code Online (Sandbox Code Playgroud)

翻译成

a++\nb++\nc++\n
Run Code Online (Sandbox Code Playgroud)

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

  1. 一个
  2. \ NB
  3. \ NC
  4. \n

当你打印出来,每一条记录被终止ORS,(),所以

a()\nb()\nc()\n()
Run Code Online (Sandbox Code Playgroud)

你添加了"我完成了"

a()\nb()\nc()\n()I am done()
Run Code Online (Sandbox Code Playgroud)

因此显示为

a()
b()
c()
()I am done()
Run Code Online (Sandbox Code Playgroud)

(由于最后一行不以换行符结束,因此提示符显示在同一行上)

  • @abc:实际上有.`echo`默认在末尾添加换行符.这就是为什么当你运行`echo"Something"`时,你的提示出现在下一行.`echo -n`用于抑制此行为(如果版本`echo`支持选项). (2认同)