【问题标题】:How to replace a particular column in a CSV with some string?如何用一些字符串替换 CSV 中的特定列?
【发布时间】:2012-08-02 19:21:48
【问题描述】:

很抱歉提出一个非常基本的问题。如何将 制表符分隔 文件中的特定列替换为某个字符串,例如“xyz”?

例如

输入:

abc\t  def\t   \t   xyz
pqr\t  ert\t   \t   yut 

输出:

abc\t  def\t   new_str\t   xyz
pqr\t  ert\t   new_str\t   yut

简而言之,我文件中的第 3 列是空的,我想用字符串替换它。

我是这样绑的:

awk '{$3="new_str"}1' test1.csv > test1_op.csv

但看起来它不维护选项卡。另请注意,该文件有 400 列,因此编写一个类似这样的 awk 命令:

awk -F, '{OFS=",";print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,...,$400}' in.csv > outfile.csv

我想避免。

谢谢。

【问题讨论】:

    标签: perl bash shell sed awk


    【解决方案1】:

    由于它是制表符分隔的,因此您可以通过在制表符上进行拆分,而不是 awk 的默认拆分为任何空格(空格、制表符和可能其他更深奥的类型的任何组合)。完成后,您可以直接指定要更改的列,然后再次打印 $0。

    awk -F$'\t' 'BEGIN {OFS="\t"} {$3="new_str"; print}' in.csv > outfile.csv
    

    awk 还可以处理出现在其输入文件列表中的变量赋值,所以这看起来更简洁:

    awk '{$3="new_str"; print}' FS=$'\t' OFS=$'\t' in.csv > outfile.csv
    

    【讨论】:

      【解决方案2】:

      这可能对你有用(GUN sed):

      sed -i 's/\t/new_str&/3' file
      

      【讨论】:

        【解决方案3】:

        目前尚不清楚您想如何处理空白,但也许您只是想要:

        awk '{$3="new_str"}1' FS=\\t OFS=\\t
        

        请注意,这会丢弃最初在 $3 中的空格。你可以保留它:

        awk '{$3=$3"new_str"}1' FS=\\t OFS=\\t
        

        awk '{$3="   new_str"}1' FS=\\t OFS=\\t
        

        取决于您的需求。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-15
          • 1970-01-01
          • 2016-07-24
          • 1970-01-01
          • 2014-10-09
          • 1970-01-01
          • 1970-01-01
          • 2021-09-12
          相关资源
          最近更新 更多