如何使用 awk 提取整个字符串?

如何使用 awk 提取整个字符串?

嗨,我有一些目录,如下所示:

TBS890
  |___________ A.ctab
TBS345A
  |___________ A.ctab
TBS567C
  |___________ A.ctab

我有兴趣从所有目录中存在的 A.ctab 文件中提取一些数据。假设A.ctab有 12 列。我对第 6 列和第 12 列感兴趣。为此,我尝试执行如下操作,但没有获取所有信息。

awk 'FNR==1 { print substr(FILENAME,1,$NF) >substr(FILENAME,1,$NF)".tmp" } 
     FNR >1 { print $12 > substr(FILENAME,1,$NF)".tmp" } 
     NR==FNR{ print $6  >"first_column.tmp" }' TBS*/A.ctab

正如您在上面的命令中看到的,我使用了$NF这将是FILENAME.我知道这是错误的,所以任何人都可以帮助我。

如果您在上面的示例中看到,有两个目录以 an 字母结尾,但有一个目录不是。我必须付出什么才能得到这个名字直到最后。

t_id    chr     strand  start   end     t_name  num_exons       length  gene_id gene_name       cov     FPKM
1       1       -       10060   10614   MSTRG.1.1       1       555     MSTRG.1 .       0.000000        0.000000
2       1       +       11140   30023   MSTRG.10.1      12      3981    MSTRG.10        .       2.052715        0.284182
3       1       -       11694   29342   MSTRG.11.1      8       6356    MSTRG.11        .       0.557588        0.077194
4       1       +       11869   14409   ENST00000456328.2       3       1657    MSTRG.10        DDX11L1 0.000000        0.000000
5       1       +       11937   29347   MSTRG.10.3      12      3544    MSTRG.10        .       0.000000        0.000000
6       1       -       11959   30203   MSTRG.11.2      11      4547    MSTRG.11        .       0.369929        0.051214
7       1       +       12010   13670   ENST00000450305.2       6       632     MSTRG.10        DDX11L1 0.000000        0.000000
8       1       +       12108   26994   MSTRG.10.5      10      5569    MSTRG.10        .       0.057091        0.007904
9       1       +       12804   199997  MSTRG.10.6      12      3567    MSTRG.10        .       0.000000        0.000000
10      1       +       13010   31097   MSTRG.10.7      12      4375    MSTRG.10        .       0.000000        0.000000
11      1       -       13068   26832   MSTRG.11.3      9       5457    MSTRG.11        .       0.995280        0.137788

A.ctab我只想从所有文件中提取t_name并列FPKM并创建一个新文件。在新文件中,该FPKM列应该是样本名称。它应该如下所示:

t_name              TBS890          TBS345A              TBS567C
MSTRG.1.1              0            0.028181                 0
MSTRG.10.1         0.284182         0.002072             0.046302
MSTRG.11.1         0.077194         0.685535             0.105849
ENST00000456328.2      0            0.307315             0.038961
MSTRG.10.3             0            0.446015             0.009946
MSTRG.11.2         0.051214         0.053577             0.036081
ENST00000450305.2      0            0.110438             0.040319
MSTRG.10.5         0.007904             0                1.430825
MSTRG.10.6             0                0                0.221105
MSTRG.10.7             0            0.199354                 0
MSTRG.11.3         0.137788         0.004792                 0

答案1

如果所有文件都有相同的t_name行数,请尝试

$ awk '
FNR == NR       {print $6 > "COL1.TMP"
                }

FNR == 1        {FN = FILENAME
                 sub (/\/[^\/]*$/, ".TMP", FN)
                 print FN  > FN
                 next
                }

                {print $12 > FN
                }
' TBS*/A.ctab
$ paste -d"\t\t\t\n" COL1.TMP TBS*.TMP

如果不是这种情况,我join就会想到实用程序;但它需要排序的输入。

相关内容