bash - 在 awk 中使用记录分隔符

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

最佳答案

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()

(由于最后一行没有以换行结尾,所以你的提示显示在同一行)

关于bash - 在 awk 中使用记录分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13078776/

相关文章:

bash - 这个 bash 补全功能是如何工作的? (对于cloudfoundry cli)

linux - 如何识别文件的一部分 bash

mongodb - shell 脚本 - 检查 mongodb 服务器是否正在运行

linux - 脚本与 ./file_name 一起工作,但是当我使用 sh file_name 启动它时出现错误

powershell - 此语法有何作用 : | select @{E={$_. PSComputerName}; L ='Server' },名称,进程 ID,路径名?

linux - 监视新文件目录的 bash 脚本

bash - mutt:从控制台回复电子邮件

scripting - 一步安装程序

powershell - 如何在我的 Ansible Playbook 中使用 Azure DevOps 服务器 (TFS) 预定义变量?

macos - 如何在 OS X 上使用 date 命令回显任何时区自午夜以来的分钟数?