![빅 데이터를 위해 Linux에서 테이블을 병합하는 방법은 무엇입니까?](https://linux55.com/image/175460/%EB%B9%85%20%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC%20%EC%9C%84%ED%95%B4%20Linux%EC%97%90%EC%84%9C%20%ED%85%8C%EC%9D%B4%EB%B8%94%EC%9D%84%20%EB%B3%91%ED%95%A9%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
~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" 파일을 생성합니다. 빠른 스크립트로 작업을 수행할 수 있지만 최고는 아닙니다.
또한 파일 이름이 출력 파일의 열 헤더와 일치한다고 가정합니다.