如何使用awk,拆分特定列(使用分隔符),然后添加后缀然后合并?

时间:2017-06-14 02:47:46

标签: parsing awk sed split gawk

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

# 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

我希望在_LT分割后,在第4列的元素(变量值)中添加后缀;

输出如:

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

3 个答案:

答案 0 :(得分:3)

您可以使用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;
  • sub(/$/,PRE,$4)_LT添加到第4列

答案 1 :(得分:1)

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

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。并根据需要打印拆分结果。

答案 2 :(得分:0)

使用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