여러 파일을 공통 열로 병합하는 awk

여러 파일을 공통 열로 병합하는 awk

여러 테이블을 공통 값으로 병합하기 위한 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열을 정렬하려면 출력을 다음으로 파이프하십시오.

관련 정보