【问题标题】:Replace character in one column of CSV file with awk gsub用 awk gsub 替换 CSV 文件的一列中的字符
【发布时间】:2017-05-20 03:25:09
【问题描述】:

我想使用 awk 将 CSV 文件转换为仅包含原始列的子集的新 CSV 文件。而且我还想用下划线替换其中一列的空格。我试过这样:

gawk -F "," '
{
  name=gsub(/ /,"_",$1);
  label=$2;
  print ","name","label","
}' ./in.csv >> ./out.csv

但是 gsub() 返回匹配出现的次数,而不是替换字符串。所以我得到这样的东西:

,1,label

代替:

,name_nospace,label

我如何像这样使用 awk gsub 仅替换一列的字符?

【问题讨论】:

  • 一些样本数据和预期输出怎么样?

标签: awk gsub


【解决方案1】:

不要:

name=gsub()

as gsub 返回替换的数量,而不是字符串。只是

gsub()

并打印您摆弄过的字段,即:

gsub(/ /,"_",$1);
label=$2;
print "," $1 "," label "," # or whatever you were doing

【讨论】:

    【解决方案2】:

    要修改“名称”,请更改:

    name=gsub(/ /,"_",$1)
    

    到(仅限 gawk 和更新的 mawk):

    name=gensub(/ /,"_","g",$1)
    

    或(任何 awk):

    name=$1
    gsub(/ /,"_",name)
    

    您还应该设置 OFS 而不是硬编码逗号,尤其是在您修改字段时,因此您的脚本应编写为:

    awk '
    BEGIN { FS=OFS="," }
    {
      name=$1
      gsub(/ /,"_",name)
      label=$2
      print "", name, label, ""
    }' ./in.csv
    

    假设使用变量而不是直接修改字段是有原因的。

    【讨论】:

      【解决方案3】:
      gawk -F "," '
      {
        gsub(/ /,"_",$1);
        # print only: ,NameValue,LabelValue,   as output
        # so 4 field with first and last empty as in OP
        print "," $1 "," $2 ","
      }' ./in.csv >> ./out.csv
      

      在这种情况下,sed 也可用

      sed -e ':under' -e 's/^\([^[ ,]*\) /\1_/;t under' -e 's/^\([^,]*,[^,]*,\).*/,\1/' ./in.csv >> ./out.csv
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-05
        • 2017-02-01
        • 1970-01-01
        • 2019-04-21
        • 2018-10-19
        • 1970-01-01
        • 2017-03-13
        相关资源
        最近更新 更多