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

How to use awk, to split a particular column (using delimiter), then add suffix and then merge?

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

# 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' '{=PRE; print}' OFS="\t" data.txt > data_LT.txt

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

$ awk -v PRE='_LT' '{gsub(/;/,PRE";",); sub(/$/,PRE,); 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,)_LT 附加到第 4 列

另一个想法是在awk,

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

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

使用 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/=_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