【问题标题】:How to edit a cell in a CSV file如何编辑 CSV 文件中的单元格
【发布时间】:2018-01-11 01:45:49
【问题描述】:

我正在寻找一个 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。这个命令不起作用,有人能帮帮我吗?

【问题讨论】:

  • 如果您能提供一些输入和预期的输出数据,那将非常有帮助。

标签: linux shell csv awk text-processing


【解决方案1】:

-F,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="; "}

【讨论】:

    【解决方案2】:

    使用 GNU sedrow 是前导 2column 是最后2,(ie单元格B2第2行第2列):

    sed '2s/\(\S\+\);/xxx;/2' data.csv
    

    输出:

    1995; 1999; 1857; 1349;
    1999; xxx; 1824; 1875;
    1923; 1324; 1343; 1432;
    

    注意:OP 使用 row 2, column 2 作为输入,但如果行号和列号不同,对于学习者来说答案可能会更清楚。为了更好的对比,这里有一个小包装函数:

    # Usage: xxx row column filename
    #        xxx row column < filename
    xxx() { sed "$1"'s/\(\S\+\);/xxx;/'"$2" "${3:-/dev/stdin}" ; }
    

    测试:

    xxx 2 2 data.csv
    

    输出:

    1995; 1999; 1857; 1349;
    1999; xxx; 1824; 1875;
    1923; 1324; 1343; 1432;
    

    使用不同的数字:

    xxx 1 3 data.csv 
    

    输出:

    1995; 1999; xxx; 1349;
    1999; 2000; 1824; 1875;
    1923; 1324; 1343; 1432;
    

    【讨论】:

      【解决方案3】:

      使用 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-07
        • 1970-01-01
        • 2017-12-10
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多