Linux

如何合併多個不按順序排列的文件並將文件名分配給linux中的特定列?

  • December 6, 2020

我有大約 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

.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
$ 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

引用自:https://unix.stackexchange.com/questions/623095