Text-Processing
根據標題對列求和
我有一個像這樣的製表符分隔文件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