【问题标题】:How to use awk, to split a particular column (using delimiter), then add suffix and then merge?如何使用 awk,拆分特定列(使用分隔符),然后添加后缀,然后合并?
【发布时间】:2017-11-16 00:07:17
【问题描述】:

在下面给出的数据中(以制表符分隔):

# data
1  xyz   alfa  x=abc;z=cbe;d=fed  xt
2  xyz   alfa  y=cde;z=xy  ft
3  xyb   delta xy=def  zf

我想在;拆分后的第4列元素(变量的值)中添加一个后缀_LT

输出如下:

1  xyz   alfa  x=abc_LT;z=cbe_LT;d=fed_LT  xt
2  xyz   alfa  y=cde_LT;z=xy_LT  ft

我可以在特定列添加后缀,但不能拆分(在 delim)-add-merge。

awk -v  PRE='_LT' '{$4=$4PRE; print}' OFS="\t" data.txt > data_LT.txt

【问题讨论】:

  • 是否应该只替换那些具有; 的值?

标签: parsing awk sed split gawk


【解决方案1】:

您可以使用split function、循环和合并...或使用替换

$ awk -v PRE='_LT' '{gsub(/;/,PRE";",$4); sub(/$/,PRE,$4); print}' OFS='\t' data.txt
1   xyz alfa    x=abc_LT;z=cbe_LT;d=fed_LT  xt
2   xyz alfa    y=cde_LT;z=xy_LT    ft
3   xyb delta   xy=def_LT   zf
  • gsub(/;/,PRE";",$4) 将所有 ; 替换为 _LT; 仅适用于第 4 列
  • sub(/$/,PRE,$4) 追加 _LT 到第 4 列

【讨论】:

    【解决方案2】:

    另一个想法是在awk中使用split()

    awk -v PRE='_LT' '{ 
        n=split($4,a,/;/); 
        b=""; 
        for(i in a){ b=b a[i] PRE; if(i!=n){b=b";"} }
        {$4=b; print $0}
    }' OFS='\t' data.txt
    

    n=split($4,a,/;/) 使用分隔符 ';' 拆分 $4。并根据需要打印拆分结果。

    【讨论】:

      【解决方案3】:

      使用 Perl

      $ cat everestial
      1  xyz   alfa  x=abc;z=cbe;d=fed  xt
      2  xyz   alfa  y=cde;z=xy  ft
      3  xyb   delta xy=def  zf
      
      $ perl -F'/\s+/' -lane ' $F[3]=~s/(.+?)=(.+?)\b/${1}=${2}_LT/g; print join("\t",@F) ' everestial
      1       xyz     alfa    x=abc_LT;z=cbe_LT;d=fed_LT      xt
      2       xyz     alfa    y=cde_LT;z=xy_LT        ft
      3       xyb     delta   xy=def_LT       zf
      

      【讨论】:

        猜你喜欢
        • 2016-10-01
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多