bash - 如果找到则使用 awk 替换特定列值

标签 bash shell awk scripting

如何使用 awk 查找并替换特定列的值?

举例来说 -> 我有一个包含以下内容的文件测试:

"abc":"100"::"new"

"xyz":"200":"mob":"old"

"lmn":"300"::"new"

"pqr":"400":"mob2":"new"

现在,如果第三列为空,那么我想替换 "N/A" 中的空白值,否则按原样打印该行,以便输出如下:

"abc":"100":"N/A":"new"

"xyz":"200":"mob":"old"

"lmn":"300":"N/A":"new"

"pqr":"400":"mob2":"new"

虽然我通过以下命令使用 awk 获得了输出:

awk -F":" '{
    if ( $3 == "")
        print $1":"$2":\"N\/A\":"$4
    else
        print $0
}' test

但这里我对每列使用硬编码值,例如 $1$2,因此,如果其他示例中的空白列从 3rd 更改为 xyz,则必须再次更改相同的命令。有没有其他方法可以使用 awk 获得相同的输出,而不使用列的硬编码值?感谢您的帮助。

最佳答案

首先,让我们稍微简化一下当前的程序:

awk -F: 'BEGIN {OFS=FS} {       
  if ( $3 == "") $3="N/A"
  print $0
}' test

现在我们可以使两件事可变:要测试的列和替换字符串。因此,程序的主体看起来像

if ( $fieldnumber == "" ) $fieldnumber=replacement

剩下要做的就是填写变量。如果您查看 awk 的手册页,您会发现选项 -v 允许我们指定 awk 变量的初始值。

awk -F: -v fieldnumber=... -v replacement=...

这允许您从任何您喜欢的地方填充此变量 - shell 脚本的参数、环境变量等。

更新:修复输出字段分隔符 (OFS) 更新:修复语法错误

关于bash - 如果找到则使用 awk 替换特定列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51258235/

相关文章:

linux - sed 删除 # 和 # 之间的字符并添加 :'s in bash script?

linux - bash 合并文件中的行

c - xcode 和 bash 中 opencl 的某些意外行为?

bash - 在 awk 中运行 md5sum 命令

python - R Markdown 代码折叠不适用于 bash,Python 代码块

macos - 使用变量创建 Mac 终端脚本

linux - 在 bash 中逐行读取文件

c - 如何找出代码何时读取父进程或子进程以及它们如何在 C 中进行通信

linux - 填充文件到 4 字节边界

linux - 如何使用正则表达式 Grep 2 文件以在行尾查找匹配项