複数のファイルを順番にマージし、Linuxの特定の列にファイル名を割り当てる方法は?

複数のファイルを順番にマージし、Linuxの特定の列にファイル名を割り当てる方法は?

約250個のファイルがあります.gtf。これには3つのファイルが表示されます.gtf。すべての.gtfファイルには、次の3つの列があります。

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

2番目の列に示すように、3つのファイルはすべて名前の順序が異なります.gtf。 3つの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

関連情報