동일한 형식(동일한 데이터 유형의 동일한 수의 열, 그러나 다른 행 수)을 갖는 세 개의 파일 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
다음을 |
추가 하십시오.join
awk