如何使用 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/