如何使用 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
在下面给出的数据中(制表符分隔):
# 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