我是使用gawk 4.0.1的,我知道如何替换CSV文件中的列值,例如:
> ROW='1,2,3,4,5,6'
> echo $ROW | gawk -F, -vOFS=, '$2="X"'
1,X,3,4,5,6
然而,我正在处理一个包含定界符的字符串文件。读取列没有问题,但是在替换值时会插入额外的分隔符:
> ROW='1,"2,3",4,5,6'
> echo $ROW | gawk -vOFS=, -vFPAT='[^,]*|"[^"]*"' '{print $2}'
"2,3"
> echo $ROW | gawk -vOFS=, -vFPAT='[^,]*|"[^"]*"' '$2="X"'
1,X,,4,5,6
这是我期望的内容:
> echo $ROW | gawk -vOFS=, -vFPAT='[^,]*|"[^"]*"' '$2="X"'
1,X,4,5,6
值为“2,3”的内容被替换成了“X,”。我该如何解决?
编辑:我没有提到我也有为空的字段。因此,更好的行示例应该是:
ROW='1,,"2,3",4,5,6'
编辑 2: 根据Dawg的答案,我得出结论,在纯awk中不可能实现。虽然我同意使用Python的解决方案更好,但唯一使用awk的解决方案是包含一些预处理和后处理来处理空字段。
#/bin/bash
ROW='1,,"2,3",4,"",5'
for col in {1..6}; do
echo $ROW |\
sed 's:,,:, ,:' |\
gawk -v c=$col -v OFS=, -v FPAT='([^,]+)|("[^\"]*")' '$c="X"' |\
sed 's:, ,:,,:g'
done
输出:
X,,"2,3",4,"",5
1,X,"2,3",4,"",5
1,,X,4,"",5
1,,"2,3",X,"",5
1,,"2,3",4,X,5
1,,"2,3",4,"",X
echo $ROW | gawk -vOFS=, -vFPAT='[^,]*|"[^"]*"' '{print $1,"X",$3}'
可以执行。我还尝试过$0=$0
重新解释字符串,但没有成功。 - fedorqui+
和括号([^,]+)|("[^"]+")
。 - user3442743FPAT = "([^,]+)|(\"[^\"]+\")"
--- hth - gboffi