如何在linux中合​​并表以实现大数据?

如何在linux中合​​并表以实现大数据?

我有〜30个文件,每个单独的文件包含两列,第一列是ID列,第二列是数字。我想将所有文件合并到一个文件中,而不是通过简单的串联命令。在一个单独的文件中,我需要所有ID 1 列中的值以及各自列中每个 ID 的相应值。如果任何一个文件中都不存在一个 ID,则分数可以为零。

ID列没有相同数量的条目,它与每个文件有很大不同。

单个文件示例

  • 10_S9.计数.矩阵
       ID             10_S9
       TRI_DN0_c0_g1   12717.85
       TRI_DN100000_c0_g1  93.65
       TRI_DN100001_c0_g1  110.58
       TRI_DN100002_c0_g1  80.76
       TRI_DN100003_c0_g1  386.84
       TRI_DN100004_c0_g1  137.85
       TRI_DN100005_c0_g1  52.14
       TRI_DN100006_c0_g1  87.19
       TRI_DN100009_c0_g1  27.88
    
  • 11_S13.计数.矩阵
       ID          11_S13
       TRI_DN0_c0_g1   22358.82
       TRI_DN0_c2_g1   164.98
       TRI_DN100000_c0_g1  164.40
       TRI_DN100001_c0_g1  140.92
       TRI_DN100002_c0_g1  196.00
       TRI_DN100003_c0_g1  46.94
       TRI_DN100004_c0_g1  71.21
       TRI_DN100005_c0_g1  106.48
       TRI_DN100006_c0_g1  28.96
    
  • 12_S17.计数.矩阵
       ID        12_S17
       TRI_DN0_c0_g1   11195.36
       TRI_DN0_c1_g1   490.24
       TRI_DN0_c2_g1   64.11
       TRI_DN0_c3_g1   14459.43
       TRI_DN0_c4_g1   4173.92
       TRI_DN0_c5_g1   4015.54
       TRI_DN1_c0_g1   194.56
       TRI_DN1_c0_g1   26.99
       TRI_DN1_c0_g1   1078.54
    
  • 13_S21.计数.矩阵
       ID        13_S21
       TRI_DN0_c0_g1   40754.51
       TRI_DN1_c0_g1   85.85
       TRI_DN1_c0_g1   80.68
       TRI_DN1_c0_g1   78.92
       TRI_DN1_c0_g1   101.48
       TRI_DN1_c0_g1   94.66
       TRI_DN1_c0_g1   189.68
       TRI_DN1_c0_g1   39.68
       TRI_DN1_c0_g1   199.86
    
  • 14_S26.计数.矩阵
       ID       14_S26
       TRI_DN0_c0_g1   35750.85
       TRI_DN0_c0_g2   1521.63
       TRI_DN0_c0_g3   8969.77
       TRI_DN0_c1_g1   13918.85
       TRI_DN0_c1_g2   797.95
       TRI_DN0_c2_g1   83624.41
       TRI_DN0_c3_g1   669.73
       TRI_DN0_c4_g1   53.83
       TRI_DN1_c0_g1   235.10
    
  • 最终的表应该是这样的:
           ID             10_S9    11_S13  12_S17  13_S21  14_S26 
    
       TRI_DN0_c0_g1      334.30    678    98.0     56.0    98.0
    *  TRI_DN0_c1_g1      200.44     0     859.36  89.03     0
       TRI_DN0_c2_g1       12.32    34     12.56    64.6    78.9
    *  TRI_DN100000_c0_g1  20.79     0       0       0        0
       TRI_DN100001_c0_g1  24.18    34.3    12.56    64.6    78.9
       TRI_DN100002_c0_g1  73.50    67.8    98.8     56.0    98.0
    *  TRI_DN100003_c0_g1  162.44   10.25   456.23  98.45     0
       TRI_DN100004_c0_g1  55.98    3.34    6.78    98.0      1.5
       TRI_DN100005_c0_g1  77.86    55.98    3.34   73.50    67.8
    

其中*符号表示 ID 仅存在于 10_S9、12_S17、13_S21 中,而在 11_S13、14_S26 中不存在,给定分数为零“0”。

请帮助我生成这个表/矩阵。

答案1

可以使用“tcsh script.csh”运行的 tcsh 脚本

#script.csh

    egrep -v '==>|ID' *.matrix | sort -k2,2 -k1,1 | sed -e's/\.counts.matrix:/ /g' | sort -k2,2 -u | awk '{printf("   %s   0.0\n",$2)}' > allIDs.txt
  
    foreach xx ( ` ls -1d *.matrix ` )
      set yy = ` echo $xx | sed -e's/matrix/matrix.tmp/g' `
      cat $xx allIDs.txt | xargs -L1 | sort -k1,1 -k2,2gr | awk 'BEGIN {last="xxx"} { if ( $1 != last ) printf(" %s\n",$0) ; last=$1}' > $yy
    end

    ( echo '  ID  '; ls -1d *.counts.matrix.tmp | sed -e's/.counts.matrix.tmp//g' | sort -k1,1 ) | xargs | sed -e's/ /     /g' -e's/ID /      ID       /g' > table.txt
    egrep -v '==>|ID' *.matrix.tmp |  sort -k2,2 -k1,1 -k3,3gr | sed -e's/.counts.matrix.tmp//g'   | awk 'BEGIN {last="xxx"} { if ($2!=last) { if (last != "xxx") printf("\n"); printf("%s    ",$2);} printf("%s     ",$3); last=$2} END{printf("\n")}' >> table.txt
    unset xx yy

将输出放入文件“table.txt”中,但格式不太好。只写出多个值中的最大值。还会创建垃圾“.matrix.tmp”文件作为中间体。一个快速脚本可以完成这项工作,但不是最好的。

还假定文件名与输出文件中的列标题一致。

相关内容