Linux에서 여러 폴더에 있는 파일의 특정 열을 사용하여 새 파일을 만드는 방법은 무엇입니까?

Linux에서 여러 폴더에 있는 파일의 특정 열을 사용하여 새 파일을 만드는 방법은 무엇입니까?

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

예를 들어:

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

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

답변1

$ cat tst.awk
BEGIN {
    FS=OFS="\t"
    numCols = 2
}
{
    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

관련 정보