빅 데이터를 위해 Linux에서 테이블을 병합하는 방법은 무엇입니까?

빅 데이터를 위해 Linux에서 테이블을 병합하는 방법은 무엇입니까?

~30개의 파일이 있고 각 개별 파일에는 두 개의 열이 포함되어 있습니다. 첫 번째는 ID 열이고 두 번째는 숫자입니다. 단순한 명령 연결이 아닌 모든 파일을 하나의 파일로 병합하고 싶습니다. 별도의 파일에는 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" 파일을 생성합니다. 빠른 스크립트로 작업을 수행할 수 있지만 최고는 아닙니다.

또한 파일 이름이 출력 파일의 열 헤더와 일치한다고 가정합니다.

관련 정보