Awk 使用bash更改一系列列的列delims

Awk 使用bash更改一系列列的列delims,awk,sed,Awk,Sed,我有一个包含多列的表,我想跳过第一列和第二列。然后我想将(n+2列)的分隔符从tab改为逗号。任何关于awk或sed的建议都肯定会有帮助,因为通常我只能查找并替换(使用sed),但我会不断替换前两列中的选项卡 示例测试集: M1 D.130 a a a M2 D.104 - a ab M3 D.150 ab ab a M4 D.160 a a - M5 D.107 a ab a M6 D.107 - ab - M7 D

我有一个包含多列的表,我想跳过第一列和第二列。然后我想将(n+2列)的分隔符从tab改为逗号。任何关于awk或sed的建议都肯定会有帮助,因为通常我只能查找并替换(使用sed),但我会不断替换前两列中的选项卡

示例测试集:

M1  D.130   a   a   a
M2  D.104   -   a   ab
M3  D.150   ab  ab  a
M4  D.160   a   a   -
M5  D.107   a   ab  a
M6  D.107   -   ab  -
M7  D.104   a   ab  ab
期望输出:

M1  D.130   a,a,a
M2  D.104   -,a,ab
M3  D.150   ab,ab,a
M4  D.160   a,a,-
M5  D.107   a,ab,a
M6  D.107   -,ab,-
M7  D.104   a,ab,ab

您可以使用此awk命令:

$ awk '{for(i=3; i<NF; i++){a=a$i","} {OFS="  "; print $1,$2,a$NF} a=""}' file
M1  D.130  a,a,a
M2  D.104  -,a,ab
M3  D.150  ab,ab,a
M4  D.160  a,a,-
M5  D.107  a,ab,a
M6  D.107  -,ab,-
M7  D.104  a,ab,ab

$awk'{for(i=3;i您可以使用此awk命令:

$ awk '{for(i=3; i<NF; i++){a=a$i","} {OFS="  "; print $1,$2,a$NF} a=""}' file
M1  D.130  a,a,a
M2  D.104  -,a,ab
M3  D.150  ab,ab,a
M4  D.160  a,a,-
M5  D.107  a,ab,a
M6  D.107  -,ab,-
M7  D.104  a,ab,ab

$awk'{for(i=3;i对于给定的输入,您只需使用下面的

awk '{print $1, $2, $3 "," $4 "," $5}' infile
否则

awk -v n=3 '{for(i=1; i<=NF; i++)printf("%s%s",$i,i==NF?ORS:i<n?OFS:",")}' infile
不呆呆地保留原始间距:

awk -v n=3 '{
              split($0,t,FS,d);
              for(i=1; i<=NF; i++)
                printf("%s%s",$i,i==NF?ORS:i<n?d[i]:",")
            }' infile
awk -v n=3 '{
              split($0,d,/[^[:space:]]*/);
              for(i=1; i<=NF; i++)
                 printf("%s%s",$i,i==NF?ORS:i<n?d[i+1]:",")
            }' infile
$ cat infile
M1  D.130   a   a   a
M2  D.104   -   a   ab
M3  D.150   ab  ab  a
M4  D.160   a   a   -
M5  D.107   a   ab  a
M6  D.107   -   ab  -
M7  D.104   a   ab  ab

$ awk -v n=3 '{for(i=1; i<=NF; i++)printf("%s%s",$i,i==NF?ORS:i<n?OFS:",")}' file
M1 D.130 a,a,a
M2 D.104 -,a,ab
M3 D.150 ab,ab,a
M4 D.160 a,a,-
M5 D.107 a,ab,a
M6 D.107 -,ab,-
M7 D.104 a,ab,ab
使用
非呆滞
保留原始间距

$ awk -v n=3 '{split($0,t,FS,d);for(i=1; i<=NF; i++)printf("%s%s",$i,i==NF?ORS:i<n?d[i]:",")}' infile
M1  D.130   a,a,a
M2  D.104   -,a,ab
M3  D.150   ab,ab,a
M4  D.160   a,a,-
M5  D.107   a,ab,a
M6  D.107   -,ab,-
M7  D.104   a,ab,ab
$ awk -v n=3 '{split($0,d,/[^[:space:]]*/);for(i=1; i<=NF; i++)printf("%s%s",$i,i==NF?ORS:i<n?d[i+1]:",")}' infile
M1  D.130   a,a,a
M2  D.104   -,a,ab
M3  D.150   ab,ab,a
M4  D.160   a,a,-
M5  D.107   a,ab,a
M6  D.107   -,ab,-
M7  D.104   a,ab,ab

$awk-vn=3'{split($0,d,/[^[:space:]]*/);对于(i=1;i对于给定的输入,您可以简单地使用以下命令

awk '{print $1, $2, $3 "," $4 "," $5}' infile
否则

awk -v n=3 '{for(i=1; i<=NF; i++)printf("%s%s",$i,i==NF?ORS:i<n?OFS:",")}' infile
不呆呆地保留原始间距:

awk -v n=3 '{
              split($0,t,FS,d);
              for(i=1; i<=NF; i++)
                printf("%s%s",$i,i==NF?ORS:i<n?d[i]:",")
            }' infile
awk -v n=3 '{
              split($0,d,/[^[:space:]]*/);
              for(i=1; i<=NF; i++)
                 printf("%s%s",$i,i==NF?ORS:i<n?d[i+1]:",")
            }' infile
$ cat infile
M1  D.130   a   a   a
M2  D.104   -   a   ab
M3  D.150   ab  ab  a
M4  D.160   a   a   -
M5  D.107   a   ab  a
M6  D.107   -   ab  -
M7  D.104   a   ab  ab

$ awk -v n=3 '{for(i=1; i<=NF; i++)printf("%s%s",$i,i==NF?ORS:i<n?OFS:",")}' file
M1 D.130 a,a,a
M2 D.104 -,a,ab
M3 D.150 ab,ab,a
M4 D.160 a,a,-
M5 D.107 a,ab,a
M6 D.107 -,ab,-
M7 D.104 a,ab,ab
使用
非呆滞
保留原始间距

$ awk -v n=3 '{split($0,t,FS,d);for(i=1; i<=NF; i++)printf("%s%s",$i,i==NF?ORS:i<n?d[i]:",")}' infile
M1  D.130   a,a,a
M2  D.104   -,a,ab
M3  D.150   ab,ab,a
M4  D.160   a,a,-
M5  D.107   a,ab,a
M6  D.107   -,ab,-
M7  D.104   a,ab,ab
$ awk -v n=3 '{split($0,d,/[^[:space:]]*/);for(i=1; i<=NF; i++)printf("%s%s",$i,i==NF?ORS:i<n?d[i+1]:",")}' infile
M1  D.130   a,a,a
M2  D.104   -,a,ab
M3  D.150   ab,ab,a
M4  D.160   a,a,-
M5  D.107   a,ab,a
M6  D.107   -,ab,-
M7  D.104   a,ab,ab

$awk-vn=3'{split($0,d,/[^[:space:]]*/);for(i=1;i与GNU awk匹配第三个参数():

对于任何awk:

$ awk 'match($0,/([^\t]+\t){2}/) {r=substr($0,RLENGTH+1); gsub(/\t/,",",r); print substr($0,1,RLENGTH) r}' file
M1      D.130    a,a,a
M2      D.104    -,a,ab
M3      D.150    ab,ab,a
M4      D.160    a,a,-
M5      D.107    a,ab,a
M6      D.107    -,ab,-
M7      D.104    a,ab,ab

使用GNU awk匹配第三个参数()

对于任何awk:

$ awk 'match($0,/([^\t]+\t){2}/) {r=substr($0,RLENGTH+1); gsub(/\t/,",",r); print substr($0,1,RLENGTH) r}' file
M1      D.130    a,a,a
M2      D.104    -,a,ab
M3      D.150    ab,ab,a
M4      D.160    a,a,-
M5      D.107    a,ab,a
M6      D.107    -,ab,-
M7      D.104    a,ab,ab

简单的awk方法:

awk -F'\t' '{ r=$1 FS $2 FS $3; for(i=4;i<=NF;i++) r=r","$i; print r }' file

简单的awk方法:

awk -F'\t' '{ r=$1 FS $2 FS $3; for(i=4;i<=NF;i++) r=r","$i; print r }' file
与塞德

sed 's/\t/,/3;s/\t/,/3' file
与塞德

sed 's/\t/,/3;s/\t/,/3' file

非常好的使用regexp的方法非常好的使用regexp的方法