>source

나는 가지고있다 .tsv 100 개 이상의 디렉토리에있는 파일. 필요한 모든 정보가 포함 된 단일 파일을 만들고 싶습니다. tsv 100 개의 디렉토리에있는 파일.

예를 들면 :

Data
 |___ SOB33D
        |___ SOB33D.tsv
 |___ SOB43E
        |___ SOB43E.tsv
 |___ SOB58D
        |___ SOB58D.tsv
 |___ SOB113A
        |___ SOB113A.tsv

데이터 SOB33D.tsv 다음과 같습니다.

target_id         length    eff_length  est_counts
ENST00000456328.2   1657      1525.05      0
ENST00000450305.2   632       500.105      0
ENST00000488147.1   1351      1219.05    0.492522
ENST00000619216.1   68        12.9174    0.70395
ENST00000473358.1   712       580.105      0
ENST00000469289.1   535       403.105      0

SOB43E.tsv :

target_id   length  eff_length  est_counts
ENST00000456328.2   1657    1525.05 0.174591
ENST00000450305.2   632 500.105 0
ENST00000488147.1   1351    1219.05 7.70424
ENST00000619216.1   68  12.9174 0.295008
ENST00000473358.1   712 580.105 0
ENST00000469289.1   535 403.105 0

SOB58D.tsv :

target_id   length  eff_length  est_counts
ENST00000456328.2   1657    1525.05 0.282655
ENST00000450305.2   632 500.105 0
ENST00000488147.1   1351    1219.05 2.64778
ENST00000619216.1   68  12.9174 0
ENST00000473358.1   712 580.105 0
ENST00000469289.1   535 403.105 0

SOB113A.tsv :

target_id   length  eff_length  est_counts
ENST00000456328.2   1657    1525.05 0.0225974
ENST00000450305.2   632 500.105 0
ENST00000488147.1   1351    1219.05 1.35652
ENST00000619216.1   68  12.9174 0
ENST00000473358.1   712 580.105 0
ENST00000469289.1   535 403.105 0

나는 사용하려고 cut . 나는 그것을 거의 옳다. 모든 파일에서 동일한 첫 번째 및 두 번째 열을 원하며 4th column which is different in all the files . 그래서 아래와 같이 사용했습니다.

paste */*.tsv | cut -f 1,2,4,8,12,16 > all_samples.tsv

위의 명령에서 모든 파일에서 동일한 첫 번째 및 두 번째 열과 모든 파일에서 네 번째 열을 가져 왔습니다. 출력은 다음과 같습니다.

산출:

target_id        length est_counts  est_counts  est_counts  est_counts
ENST00000456328.2   1657    0   0.174591    0.282655    0.0225974
ENST00000450305.2   632 0   0   0   0
ENST00000488147.1   1351    0.492522    7.70424 2.64778 1.35652
ENST00000619216.1   68  0.70395 0.295008    0   0
ENST00000473358.1   712 0   0   0   0
ENST00000469289.1   535 0   0   0   0

예상 출력 :

target_id         length    SOB33D  SOB43E  SOB58D  SOB113A
ENST00000456328.2   1657    0   0.174591    0.282655    0.0225974
ENST00000450305.2   632 0   0   0   0
ENST00000488147.1   1351    0.492522    7.70424 2.64778 1.35652
ENST00000619216.1   68  0.70395 0.295008    0   0
ENST00000473358.1   712 0   0   0   0
ENST00000469289.1   535 0   0   0   0

더 적은 수의 파일을 사용할 수 있습니다. paste ,하지만 100 files in 100 directories . 따라서 모든 파일에서 단일 파일을 만드는 방법 .tsv 파일 100 directories 열 이름으로 폴더 이름을 사용합니까?

도움을 주시면 감사하겠습니다. thanq


  • 답변 # 1

    $ cat tst.awk
    BEGIN {
        FS=OFS="\t"
        numCols = 3
    }
    {
        if ( FNR == 1 ) {
            numCols++
            val = FILENAME
            sub("/[^/]+$","",val)
            sub(".*/","",val)
        }
        else {
            val = $4
        }
        vals[FNR,1] = $1
        vals[FNR,2] = $2
        vals[FNR,numCols] = val
    }
    END {
        for (rowNr=1; rowNr<=FNR; rowNr++) {
            for (colNr=1; colNr<=numCols; colNr++) {
                printf "%s%s", vals[rowNr,colNr], (colNr<numCols ? OFS : ORS)
            }
        }
    }
    
    

    $ awk -f tst.awk */estimate.tsv
    target_id       length          SOB33D  SOB43E
    ENST00000456328.2       1657            0       0.174591
    ENST00000450305.2       632             0       0
    ENST00000488147.1       1351            0.492522        7.70424
    ENST00000619216.1       68              0.70395 0.295008
    ENST00000473358.1       712             0       0
    ENST00000469289.1       535             0       0
    
    

    위는 다음 입력을 사용하여 실행되었습니다 (모든 공백은 탭임).

    $ head */estimate.tsv
    ==> SOB33D/estimate.tsv <==
    target_id       length  eff_length      est_counts
    ENST00000456328.2       1657    1525.05 0
    ENST00000450305.2       632     500.105 0
    ENST00000488147.1       1351    1219.05 0.492522
    ENST00000619216.1       68      12.9174 0.70395
    ENST00000473358.1       712     580.105 0
    ENST00000469289.1       535     403.105 0
    ==> SOB43E/estimate.tsv <==
    target_id       length  eff_length      est_counts
    ENST00000456328.2       1657    1525.05 0.174591
    ENST00000450305.2       632     500.105 0
    ENST00000488147.1       1351    1219.05 7.70424
    ENST00000619216.1       68      12.9174 0.295008
    ENST00000473358.1       712     580.105 0
    ENST00000469289.1       535     403.105 0
    
    

관련 자료

  • 이전 regular expression - 단어가 3 번 나오는 줄을 찾기 위해 grep을 어떻게 사용합니까?
  • 다음 Linux Mint 20 (Ubuntu 2004 기반)의 Android Studio 41에서 두 번째 프로젝트를 열면 모든 것이 멈 춥니 다