세 파일 비교: 열 비교를 사용하여 모든 파일에 있는 줄을 비교합니다.

세 파일 비교: 열 비교를 사용하여 모든 파일에 있는 줄을 비교합니다.

동일한 형식(동일한 데이터 유형의 동일한 수의 열, 그러나 다른 행 수)을 갖는 세 개의 파일 2d.tsv, 3d.tsv가 있습니다 .4d.tsv

2d_new.tsv세 번째 열을 비교하고 세 개의 새 파일에 기록하여 3d_new.tsv모든 파일에 있는 행을 선택 하고 싶습니다. 4d_new.tsv즉, 세 개의 새 파일이 동일한 행 수를 갖고 그에 따라 원래 첫 번째 열을 유지하고 싶습니다. 두 번째 열을 나머지 행에 연결합니다. 이 작업을 수행하는 방법을 도와주실 수 있나요?

입력 예:

2d.tsv

0.1 0.22 gene1
0.3 0.1 gene2
0.5 0.33 gene3
0.3 0.44 gene5
0.9 0.3 gene6

3d.tsv

0.4 0.5 gene2
0.6 0.1 gene3
0.1 0.99 gene4
0.01 0.44 gene5

4d.tsv

0.03 0.11 gene1
0.33 0.34 gene2
0.54 1 gene3
0.41 0.44 gene4
0.44 0.45 gene5
0.11 0.89 gene6

원하는 출력:

2d_new.tsv

0.3 0.1 gene2
0.5 0.33 gene3
0.3 0.44 gene5

3d_new.tsv

0.4 0.5 gene2
0.6 0.1 gene3
0.01 0.44 gene5

4d_new.tsv

0.33 0.34 gene2
0.54 1 gene3
0.44 0.45 gene5

답변1

나는 놀라운 원 히트 솔루션을 제시할 슈퍼스타들이 있다고 확신 awk하지만 여기에 큰 망치가 있습니다.

모든 파일이 열 3의 키에 맞게 정렬되어 있다고 가정합니다(그렇지 않은 경우 sort -k 3 file먼저 파일을 정렬해야 합니다).

join -j 3 2d.tsv 3d.tsv | join -1 1 -2 3 - 4d.tsv > tmp
awk '{print $2, $3, $1}' tmp > 2d_new.tsv
awk '{print $4, $5, $1}' tmp > 3d new.tsv
awk '{print $6, $7, $1}' tmp > 4d_new.tsv

마지막 3줄은 병합 가능

awk '{ print $2, $3, $1 > "2d_new.tsv"; print $4 $5, $1 > "3d_new.tsv"; print $6, $7, $1 > "4d_new.tsv" }' tmp

파일링을 피하기 위해 단일 라이너를 사용하려면 tmp다음을 |추가 하십시오.joinawk

관련 정보