【问题标题】:transform file with key value (comma separated) into a file with only values将具有键值(逗号分隔)的文件转换为仅具有值的文件
【发布时间】:2021-04-20 00:46:24
【问题描述】:

我有以下文件-

k11=v11,k12=v12,k13=v13,...,k1N=v1N
k21=v21,k22=v22,k23=v23,...,k2N=v2N
...
...

请注意,键和值可以是字母数字。我想要一种快速生成另一个文件的方法 具有以下内容-

v11,v12,v13,..,v1N
v21,v22,v23,..,v2N
....

我可以使用 sed 或 awk 快速完成此操作吗?

【问题讨论】:

    标签: file awk sed transform


    【解决方案1】:

    使用 awk 的另一个选项是使用否定字符类 [^,=]+ 删除除逗号或等号以外的任何字符,或使用 [[:alnum:]]+= 仅匹配字母数字


    $ cat file

    k11=v11,k12=v12,k13=v13
    k21=v21,k22=v22,k23=v23
    

    Awk

    awk '
    gsub(/[^=,]+=/,"")
    ' file > output
    
    cat output
    

    输出

    v11,v12,v13
    v21,v22,v23
    

    【讨论】:

      【解决方案2】:

      这是一个 awk:

      awk -F, '{for (i=1;i<=NF;i++) {
                split($i,a,/=/)
                printf "%s%s", a[2], (i<NF ? FS : ORS)
              }
          }'  file > new_file 
      

      【讨论】:

        【解决方案3】:

        使用 GNU sed:

        sed -r 's/(^|,)[^=]+=/\1/g'
        

        解释:

        • (^|,) 表示行的开头 (^) 或逗号。由于括号,它存储在寄存器 #1 中。
        • [^=]+= 表示由除等号 ([^=]) 以外的任何字符组成的字符串,至少有一个字符长 (+),并紧跟等号
        • 两者都被寄存器#1 (s/.../\1/) 的内容替换。实际上,这会删除第二部分
        • 末尾的 g 标志会根据需要重复操作

        更短的形式:sed -r 's/[^,=]+=//g'

        POSIX 友好,如果您没有 GNU sed:sed 's/[^,=]\+=//g'

        【讨论】:

        • perl 中的等价物:perl -pe 's/\w+=//g' file.csv
        猜你喜欢
        • 2018-04-03
        • 2013-11-14
        • 2017-12-13
        • 2021-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-20
        • 1970-01-01
        相关资源
        最近更新 更多