【问题标题】:Replace in a CSV file value of a column [closed]替换列的CSV文件值[关闭]
【发布时间】:2013-12-23 21:56:39
【问题描述】:

我有一个具有这种结构的 CSV 文件:

31126000283424431;32285076389;t;text text;1;3;;1;1;0.9;0.81;0;0;1;1;1;2013-11-21;;NL
31126000279521531;32308233749;c;text text;1;2;;1;9;2.79;7.78;0;0;4;16;9;2013-11-21;;NL
31126000279406931;32291254349;c;text text;1;5;;1;3;0.98;0.96;0;0;3;9;0;2013-11-21;;NL
31126000272138431;32284912829;c;text text;1;3;;1;1;0;0;0;0;3;9;0;2013-11-21;;NL
31126000271468431;32304086789;t;text text;1;5;;1;1;0.2;0.04;0;0;2;4;1;2013-11-21;;NL
31126000269838731;29269530509;c;text text;1;1;;1;1;0.45;0.2;0;0;3;9;0;2013-11-21;;NL

我需要将第六个分号后的数字替换为0。

所以输出文件看起来像:

31126000283424431;32285076389;t;text text;1;0;;1;1;0.9;0.81;0;0;1;1;1;2013-11-21;;NL
31126000279521531;32308233749;c;text text;1;0;;1;9;2.79;7.78;0;0;4;16;9;2013-11-21;;NL
31126000279406931;32291254349;c;text text;1;0;;1;3;0.98;0.96;0;0;3;9;0;2013-11-21;;NL
31126000272138431;32284912829;c;text text;1;0;;1;1;0;0;0;0;3;9;0;2013-11-21;;NL
31126000271468431;32304086789;t;text text;1;0;;1;1;0.2;0.04;0;0;2;4;1;2013-11-21;;NL
31126000269838731;29269530509;c;text text;1;0;;1;1;0.45;0.2;0;0;3;9;0;2013-11-21;;NL

我一直在尝试 awk、sed 和 cut,但无法正常工作。

谢谢

【问题讨论】:

标签: linux bash csv sed awk


【解决方案1】:

您的示例显示了第 6 列,但在 5th 半之后。

awk -F';' -v OFS=';' '$6=0;7' file

试试上面的那一行

【讨论】:

    【解决方案2】:
    sed "s/;[^;]\{1,\}/;0/5" YourFile.csv
    

    假设列中总有一些东西

    sed "s/;[^;]*/;0/5" YourFile.csv
    

    即使没有数字,在每种情况下都发生变化是第 6 列

    【讨论】:

      【解决方案3】:

      如果你的机器上有 php,你可以使用这个非常方便的CSV Paser class。它会将您的 CSV 转换为 2D 数组,您可以从中循环使用 foreach 循环并更改数据。

      $csvFile
      foreach($csvFile as $value){
          foreach($value as $k => $v){
              if($k == 5){ $v = 0}
          }
      }
      

      这将自动处理任何大小的相同格式的 CSV 文件。

      【讨论】:

        【解决方案4】:
        perl -MText::CSV_XS -e'$csv=Text::CSV_XS->new({sep_char=>";", eol=>"\n"}); while($row=$csv->getline(ARGV)) {$row->[5]=0;$csv->print(STDOUT, $row)}'
        

        用作过滤器或将输入文件作为参数。对于任何严肃的工作,您都应该使用适当的 CSV 解析器。

        【讨论】:

          猜你喜欢
          • 2018-06-22
          • 2021-07-21
          • 2021-08-26
          • 2014-03-05
          • 2022-01-17
          • 1970-01-01
          • 1970-01-01
          • 2021-10-14
          • 1970-01-01
          相关资源
          最近更新 更多