여러 파일을 순서대로 병합하고 Linux의 특정 열에 파일 이름을 할당하는 방법은 무엇입니까?

여러 파일을 순서대로 병합하고 Linux의 특정 열에 파일 이름을 할당하는 방법은 무엇입니까?

약 250개의 파일이 있습니다 .gtf. 여기에는 3개의 파일이 표시됩니다 .gtf. 모든 .gtf파일에는 아래와 같이 세 개의 열이 있습니다.

TUSCC120A.gtf
TUSCC36.gtf
TUSCC89B.gtf

TUSCC120A.gtf다음과 같이:

transcript MSTRG.6968.1 0.000000
transcript MSTRG.6968.2 1.000000
transcript MSTRG.6975.2 0.000000
transcript ENST00000446 3.000000
transcript ENST00000432 0.000000

TUSCC36.gtf다음과 같이:

transcript ENST00000446 3.456000
transcript MSTRG.6968.2 1.342000
transcript MSTRG.6968.1 0.000000
transcript MSTRG.6975.2 4.000000
transcript ENST00000432 5.000000

TUSCC89B.gtf다음과 같이:

transcript MSTRG.6975.2 2.213000
transcript MSTRG.6968.2 4.342000
transcript ENST00000432 2.000000
transcript ENST00000446 0.000000
transcript MSTRG.6968.1 3.000000

두 번째 열에서 볼 수 있듯이 3개 파일 모두 이름 순서가 다릅니다 .gtf. 세 개의 gtf 파일을 모두 병합하려고 합니다. 나는 전에 시도했다paste

paste TUSCC120A.gtf TUSCC36.gtf TUSCC89B.gtf > output.txt

output.txt좋다:

transcript MSTRG.6968.1 0.000000         transcript ENST00000446 3.456000        transcript MSTRG.6975.2 2.213000
transcript MSTRG.6968.2 0.000000         transcript MSTRG.6968.2 1.342000        transcript MSTRG.6968.2 4.342000
transcript MSTRG.6975.2 0.000000         transcript MSTRG.6968.1 0.000000        transcript ENST00000432 2.000000
transcript ENST00000446 0.000000        transcript MSTRG.6975.2 4.000000        transcript ENST00000446 0.000000
transcript ENST00000432 0.000000        transcript ENST00000432 5.000000        transcript MSTRG.6968.1 3.000000

출력이 다음과 같기를 원합니다.

ID               target_Ids        TUSCC120A            TUSCC36       TUSCC89B
transcript      MSTRG.6968.1       0.000000            0.000000        3.000000
transcript      MSTRG.6968.2       1.000000            1.342000        4.342000
transcript      MSTRG.6975.2       0.000000            4.000000        2.213000
transcript      ENST00000446      3.000000            3.456000        0.000000
transcript      ENST00000432      0.000000            5.000000        2.000000

답변1

$ cat -f tst.awk
BEGIN {
    header = "id" FS "target_id"
}

FNR == 1 { 
    f = FILENAME
    sub(/\.gtf/,"",f)
    header = header FS f
}

{
    row[$2] = (FNR==NR ? $0 : row[$2] FS $3)
}

END {
    print header
    for (x in row) print row[x]
}

용법:

$ awk -f tst.awk *.gtf
id target_id TUSCC120A TUSCC36 TUSCC89B
transcript MSTRG.6968.1 0.000000 0.000000 3.000000
transcript MSTRG.6975.2 0.000000 4.000000 2.213000
transcript MSTRG.6968.2 1.000000 1.342000 4.342000
transcript ENST00000446 3.000000 3.456000 0.000000
transcript ENST00000432 0.000000 5.000000 2.000000

관련 정보