如何合并多个不按顺序的文件并将文件名分配给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

相关内容