awk를 사용하여 전체 문자열을 추출하는 방법은 무엇입니까?

awk를 사용하여 전체 문자열을 추출하는 방법은 무엇입니까?

안녕하세요 저는 몇 가지 디렉토리를 가지고 있으며 아래와 같습니다.

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

모든 디렉토리에 있는 A.ctab 파일에서 일부 데이터를 추출하고 싶습니다. 12개의 열이 있다고 가정해 보겠습니다 A.ctab. 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. 나는 이것이 잘못되었다는 것을 알고 있습니다. 누구든지 여기서 나를 도와줄 수 있습니까?

위의 예에서 볼 수 있듯이 두 개의 디렉터리는 ann 알파벳으로 끝나지만 한 디렉터리는 그렇지 않습니다. 이름을 끝까지 얻기 위해 내가 주어야 할 것은 무엇인가.

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가 떠오를 것입니다. 하지만 정렬된 입력이 필요합니다.

관련 정보