Wie extrahiert man die gesamte Zeichenfolge mit awk?

Wie extrahiert man die gesamte Zeichenfolge mit awk?

Hallo, ich habe einige Verzeichnisse und es sieht wie folgt aus:

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

Ich möchte einige Daten aus den A.ctab-Dateien extrahieren, die in allen Verzeichnissen vorhanden sind. Nehmen wir an, sie A.ctabhaben 12 Spalten. Mich interessieren die 6. und 12. Spalte. Dafür versuche ich es wie unten beschrieben, bekomme aber nicht alle Informationen.

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

Wie Sie in meinem obigen Befehl sehen, habe ich verwendet, $NFwas das Ende von sein wird FILENAME. Ich weiß, dass das falsch ist, also kann mir hier jemand helfen.

Wie Sie in meinem obigen Beispiel sehen, enden zwei Verzeichnisse mit dem Buchstaben „ann“, ein Verzeichnis jedoch nicht. Was ich tun muss, um den Namen bis zum Ende zu erhalten.

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

Aus allen A.ctabDateien möchte ich nur eine Spalte extrahieren t_nameund FPKMeine neue Datei erstellen. In der neuen Datei FPKMsollte die Spalte den Namen der Probe enthalten. Sie sollte wie folgt aussehen:

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

Antwort1

Falls ALLE Dateien die gleiche t_nameZeilenanzahl aufweisen, versuchen Sie

$ 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

Sollte dies nicht der Fall sein, joinbietet sich das Utility an, welches allerdings sortierte Eingaben erfordert.

verwandte Informationen