awkを使用して文字列全体を抽出するには?

awkを使用して文字列全体を抽出するには?

こんにちは。以下のディレクトリがあります。

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

すべてのディレクトリにあるA.ctabファイルからいくつかのデータを抽出したいと思います。A.ctab12列があるとします。私は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。これが間違っていることを知っているので、誰でも私を助けることができます。

上記の例では、2 つのディレクトリは文字 an で終わりますが、1 つのディレクトリはそうではありません。最後までこの名前を得るために私は何を捧げなければならなかったのだろうか。

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ユーティリティを考えますが、ソートされた入力が必要です。

おすすめ記事