Text-Processing

根據標題對列求和

  • May 28, 2020

我有一個像這樣的製表符分隔文件1(顯示子集,實矩陣 60x60000):

rowname   header1 header2 header3 header4 header5 header6 header7 header8
rowname1    1       1        10       2     3       1       10       2 
rowname2    0       7        200      3     37      1        2       1 

還有另一個像這樣的file2:

header1,header2
header3
header4,header5
header6,header8
header7

我想對 file2 的每一行中指定的列求和:

rowname    header1 header3 header4 header6 header7 
rowname1    2        10        5     3       10
rowname2    7        200       40    2       2

所以 column1+column2,column3 原樣,column4+column5,column6+column8,column7 原樣……

有些列必須求和,有些則不需要,而且要求和的列並不總是連續的。

如果對列求和,則第一列的標題需要保留在輸出文件中。

我想知道您是否有awk的解決方案。到目前為止,我只知道如何儲存標題條目:

awk '
NR==1 {
   for (i=1; i<=NF; i++) {
       f[$i] = i
   }
awk '
 FNR==NR{
   newhdr[FNR]=$1       # new header name
   newhdrcnt++          # number of new header names
   for (i=1;i<=NF;i++)
     hdrnames[FNR]=$0   # save new header names comma-separated
   next
 }
 FNR==1{
   # save column numbers for new header names in array hdrcols
   for (i=1;i<=newhdrcnt;i++){
     n=split(hdrnames[i], oldhdr, ",")
     for(j=1;j<=n;j++){
       for(k=2;k<=NF;k++){
         if ($(k) == oldhdr[j]){
           hdrcols[i]=(j==1 ? "" : hdrcols[i] ",") k;
           if (j==n) break
         }
       }
     }
   }
   # print header
   printf $1
   for (i=1;i<=newhdrcnt;i++)
     printf FS newhdr[i]
   printf ORS
   next
 }
 { # print data
   printf $1
   for (i=1;i<=newhdrcnt;i++){
     n=split(hdrcols[i], cols, ",")
     res=0
     for(j=1;j<=n;j++)
       res=res+$(cols[j])
     printf FS res
   }
   printf ORS
 }
' FS="," file2 FS="\t" file1

輸出:

rowname header1 header3 header4 header6 header7
rowname1        2       10      5       3       10
rowname2        7       200     40      2       2

引用自:https://unix.stackexchange.com/questions/589491