【发布时间】:2014-11-20 00:20:42
【问题描述】:
我使用的是 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's 的回答我认为这在纯 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重新解释字符串,但没有运气。 -
@gospes 为什么要依赖 awk?您想从其他工具中获得答案吗?
-
试试
+s 和括号([^,]+)|("[^"]+") -
根据the fine manual,您应该在替代运算符
|的任一侧使用分组。那就是(总是来自以前的来源),FPAT = "([^,]+)|(\"[^\"]+\")"--- hth -
@Jidder:这也不起作用,或者至少,如果我有空字段。