ビッグデータのためにLinuxでテーブルをマージする方法は?

ビッグデータのためにLinuxでテーブルをマージする方法は?

〜30個のファイルがあり、各個々のファイルには2つの列が含まれています。最初はID列、2番目は数値です。単純なコマンド接続ではなく、すべてのファイルを1つのファイルにマージしたいと思います。別個のファイルには、ID 1 列のすべての値とその列の各 ID に対応する値が必要です。両方のファイルにIDがない場合、スコアは0になることがあります。

列のID項目数は同じではなく、ファイルごとに大きく異なります。

単一ファイルの例

  • 10_S9.Count.Matrix
       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.Count.Matrix
       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.Count.Matrix
       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.Count.Matrix
       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.Count.Matrix
       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 "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"ファイルを生成します。クイックスクリプトで作業を実行できますが、最高ではありません。

また、ファイル名が出力ファイルの列ヘッダーと一致すると仮定します。

おすすめ記事