如何使用awk基于列中的值写入标题名称

如何使用awk基于列中的值写入标题名称,awk,Awk,我有一个tab delim输入文件,其中包含>100列,值范围为0-30。下面是一个包含6列4行的示例输入文件。第一行是标题行 ID S1 S2 S3 S4 S5 CNV1 2 0 2 0 2 CNV2 6 2 2 2 1 CNV3 2 1 3 2 4 我需要将列创建为0、1、2、3、4和>4,并使用与inputfile中列的值对应的标题名称填充列。示例输出如下所示: Output: ID 0

我有一个tab delim输入文件,其中包含>100列,值范围为0-30。下面是一个包含6列4行的示例输入文件。第一行是标题行

ID      S1  S2  S3  S4  S5
CNV1    2   0   2   0   2
CNV2    6   2   2   2   1
CNV3    2   1   3   2   4
我需要将列创建为0、1、2、3、4和>4,并使用与inputfile中列的值对应的标题名称填充列。示例输出如下所示:

Output:
ID       0         1        2          3    4   >4
CNV1    S2,S4             S1,S3,S5
CNV2               S5     S2,S3,S4               S1
CNV3               S2     S1,S4        S3   S5

非常感谢您的帮助。

awk
向救援人员致敬

$ awk -v OFS='\t' 'NR==1{split($0,h); print $1,0,1,2,3,4,">4"; next}
                        {delete a; 
                         for(i=2;i<=NF;i++) 
                           {if($i>4)$i=4; 
                            a[$i]=(($i in a)?a[$i]","h[i]:h[i])} 
                           printf "%s\t",$1; 
                           for(i=0;i<=NF;i++) printf "%s\t", (a[i]?a[i]:" "); 
                           print ""}' file

ID      0       1       2       3       4       >4
CNV1    S2,S4           S1,S3,S5
CNV2            S5      S2,S3,S4                S1
CNV3            S2      S1,S4   S3      S5
$awk-vofs='\t''NR==1{split($0,h);打印$1,0,1,2,3,4,“>4”;下一步}
{删除一项;
(i=2;i4)$i=4;
a[$i]=((a中的$i)?a[$i],“h[i]:h[i])
printf“%s\t”,$1;

对于(i=0;i请尝试使用任意数量的值和标题的此版本:

awk '                     
FNR==1 {for(i=2;i<=NF;i++) {headers[i]=$i}}
FNR>1 {
  if (maxrow<FNR) { maxrow=FNR}
  rowheaders[FNR]=$1;
  for(i=2;i<=NF;i++) {
    if (maxvalue<$i) {maxvalue=$i}
    if(!values[$1,$i]) {
      values[$1,$i]=headers[i]
    } else {
      values[$1,$i]=values[$1,$i] "," headers[i]
    }
  }
}
END { for (i=2;i<=maxrow;i++) { for (j=0;j<=maxvalue;j++) { if (values[rowheaders[i],j] && maxlen<length(values[rowheaders[i],j])) { maxlen=length(values[rowheaders[i],j])}}} 
  printf("%" maxlen "s","ID"); for (i=0;i<=maxvalue;i++) { printf("%s%" maxlen  "s",OFS,i)}; printf("\n")
  for (i=2;i<=maxrow;i++) {
    printf ("%" maxlen "s",rowheaders[i])
    for (j=0;j<=maxvalue;j++) {
      if (!values[rowheaders[i],j]) {
        printf("%s%" maxlen "s",OFS," ")
      }
      else {
        printf("%s%" maxlen "s",OFS,values[rowheaders[i],j])
      }
    }
    printf("\n")
  }
}'
awk'
FNR==1{for(i=2;i1{
如果(maxrow
$ awk '                     
FNR==1 {for(i=2;i<=NF;i++) {headers[i]=$i}}
FNR>1 {
  if (maxrow<FNR) { maxrow=FNR}
  rowheaders[FNR]=$1;
  for(i=2;i<=NF;i++) {
    if (maxvalue<$i) {maxvalue=$i}
    if(!values[$1,$i]) {
      values[$1,$i]=headers[i]
    } else {
      values[$1,$i]=values[$1,$i] "," headers[i]
    }
  }
}
END { for (i=2;i<=maxrow;i++) { for (j=0;j<=maxvalue;j++) { if (values[rowheaders[i],j] && maxlen<length(values[rowheaders[i],j])) { maxlen=length(values[rowheaders[i],j])}}} 
  printf("%" maxlen "s","ID"); for (i=0;i<=maxvalue;i++) { printf("%s%" maxlen  "s",OFS,i)}; printf("\n")
  for (i=2;i<=maxrow;i++) {
    printf ("%" maxlen "s",rowheaders[i])
    for (j=0;j<=maxvalue;j++) {
      if (!values[rowheaders[i],j]) {
        printf("%s%" maxlen "s",OFS," ")
      }
      else {
        printf("%s%" maxlen "s",OFS,values[rowheaders[i],j])
      }
    }
    printf("\n")
  }
}' inputfile    

      ID        0        1        2        3        4        5        6
    CNV1    S2,S4          S1,S3,S5                                    
    CNV2                S5 S2,S3,S4                                  S1
    CNV3                S2    S1,S4       S3       S5