将来自不同文件的相似列合并到矩阵中

Merging similar columns from different files into a matrix

我有以下格式的文件,每个文件的第一列在所有文件中都是通用的:

  File1.txt
  ID    Score            
  ABCD   0.9
  BCBS   0.2
  NBNC   0.67
  TCGS   0.8

  File2.txt
  ID    Score            
  ABCD   0.3
  BCBS   0.9
  NBNC   0.73
  TCGS   0.12

  File3.txt
  ID    Score            
  ABCD   0.23
  BCBS   0.65
  NBNC   0.94
  TCGS   0.56

我想将所有文件的第二列(分数列)与第一列合并,并显示文件名减去每个文件的扩展名作为 header 以确定在哪里分数来自这样的矩阵看起来像

   ID     File1  File2 File3
  ABCD     0.9   0.3   0.23
  BCBS     0.2   0.9   0.65        
  NBNC     0.67  0.73  0.94          
  TCGS     0.8   0.12  0.56         
$ cat tst.awk
BEGIN { OFS="\t" }
FNR>1 { id[FNR] = ; score[FNR,ARGIND] =  }
END {
    printf "%s%s", "ID", OFS
    for (colNr=1; colNr<=ARGIND; colNr++) {
        sub(/\..*/,"",ARGV[colNr])
        printf "%s%s", ARGV[colNr], (colNr<ARGIND?OFS:ORS)
    }
    for (rowNr=2; rowNr<=FNR; rowNr++) {
        printf "%s%s", id[rowNr], OFS
        for (colNr=1; colNr<=ARGIND; colNr++) {
            printf "%s%s", score[rowNr,colNr], (colNr<ARGIND?OFS:ORS)
        }
    }
}

$ awk -f tst.awk File1.txt File2.txt File3.txt
ID      File1   File2   File3
ABCD    0.9     0.3     0.23
BCBS    0.2     0.9     0.65
NBNC    0.67    0.73    0.94
TCGS    0.8     0.12    0.56

选择一些你输入中不会出现的字符串作为OFS,我用的是制表符。

如果您没有 GNU awk,请在脚本开头添加 FNR==1{ ARGIND++ }

另一种选择

$ awk 'NR==1{[=10=]="\t"FILENAME}1' File1 > all; 
  for f in File{2..6}; 
     do 
       paste all <(p $f) > temp && cp temp all; 
     done

定义函数 p 为

p() { awk 'NR==1{print FILENAME;next} {print }' ; }

我将您的数据复制到 6 个相同的文件 File1..File6 并且脚本生成了这个。大部分工作是设置列名

ID      File1   File2   File3   File4   File5   File6
  ABCD   0.9    0.9     0.9     0.9     0.9     0.9
  BCBS   0.2    0.2     0.2     0.2     0.2     0.2
  NBNC   0.67   0.67    0.67    0.67    0.67    0.67
  TCGS   0.8    0.8     0.8     0.8     0.8     0.8