여러 테이블을 공통 값으로 병합하기 위한 Unix의 awk 명령에 대한 질문이 있습니다.
1 번 테이블
Geneid Chr Start End Strand Length Sample_1
ENSG00000278267 1 17369 17436 - 68 0
ENSG00000243485 1;1;1 29554;30267;30976 30039;30667;31109 +;+;+ 1021 0
탭 2
Geneid Chr Start End Strand Length Sample_2
ENSG00000278267 1 17369 17436 - 68 0
ENSG00000243485 1;1;1 29554;30267;30976 30039;30667;31109 +;+;+ 1021 0
탭 3
Geneid Chr Start End Strand Length Sample_3
ENSG00000278267 1 17369 17436 - 68 0
ENSG00000243485 1;1;1 29554;30267;30976 30039;30667;31109 +;+;+ 1021 0
보시다시피 Geneid는 이 테이블에서 유사합니다. GeneID 열과 "Sample_n" 열이 있는 파일을 1로 병합하고 싶습니다.
awk 'NR==FNR {h[$1] = $7; next} {print $1,$7,h[$1]}' Sample_1.txt Sample_2.txt | head
아무것도 놓치지 않았다면 다음을 의미합니다. NR==FNR, 첫 번째 파일은 {h[$1] = $7; next} h를 출력하는 템플릿입니다. h는 열 7의 값과 연결된 파일 1의 GeneID를 포함합니다. $1,$7,h[$1]} 두 번째 파일의 첫 번째/7번째/열을 인쇄하여 h 값에 포함된 GeneID를 찾습니다.
2개 파일에는 작동하지만 3개 이상의 파일에는 작동하지 않습니다.
Geneid Sample_1 Sample_2
ENSG00000278267 0 0
ENSG00000243485 0 0
이 사이트를 보았고 사람들이 모든 코드를 게시했지만 명령을 잘 이해하지 못하는데 이러한 파일을 병합하는 방법을 알고 명령의 매개 변수를 설명할 수 있는 사람이 있습니까?
답변1
awk '
{samples[$1] = samples[$1] OFS $NF}
END {
# print the header first
print "Geneid", samples["Geneid"]
delete samples["Geneid"]
# and then the rest of the data
for (geneid in samples) print geneid, samples[geneid]
}
' Tab*
| column -t
열을 정렬하려면 출력을 다음으로 파이프하십시오.