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. 이것이 잘못된 것임을 알고 있으므로 누구든지 나를 도울 수 있습니다.

위의 예에서 보면 두 디렉터리는 문자 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유틸리티를 생각하겠지만 정렬된 입력이 필요합니다.

관련 정보