我正在寻找一个shell脚本来修改 CSV 文件中单元格中的数据(不是列中的所有单元格)。我有这个命令:
awk -v r=2 -v c=1 -v val=xxx -F, \
'BEGIN{OFS=";"}; NR != r; NR == r {$c = val; print}' data.csv
输入:
1995; 1999; 1857; 1349;
1999; 2000; 1824; 1875;
1923; 1324; 1343; 1432;
输出:
1995; 1999; 1857; 1349;
1999; xxx; 1824; 1875;
1923; 1324; 1343; 1432;
我需要修改 B2 单元格并将 xxx 字符串放在 2000 中。这个命令不起作用,有人可以帮帮我吗?
答案 0 :(得分:1)
FS
为,
时, FS
正在将;
设置为awk -v r=2 -v c=2 -v val='xxx' 'BEGIN{FS=OFS=";"} NR==r{$c=val} 1' data.csv
。这样做:
BEGIN{FS=OFS="; "}
或者如果每个分号后面都跟着一个空白字符,就像你发布的样本输入/输出一样:
;
或每个BEGIN{FS="; ?"; OFS="; "}
后的空格是否可选:
BEGIN{FS="; *"; OFS="; "}
或:
{{1}}
答案 1 :(得分:0)
使用 GNU sed
,行是领先的 2 ,列是最后的 2 ,( ie cell B2 第2行,第2列) :
sed '2s/\(\S\+\);/xxx;/2' data.csv
输出:
1995; 1999; 1857; 1349;
1999; xxx; 1824; 1875;
1923; 1324; 1343; 1432;
答案 2 :(得分:0)
使用Miller(https://github.com/johnkerl/miller)并运行
mlr --nidx --fs ";" clean-whitespace then put 'if ($[[[2]]] == 2000 && NR ==2) {$[[[2]]] = "xxx"}' input.txt
您将拥有
1995;1999;1857;1349;
1999;xxx;1824;1875;
1923;1324;1343;1432;