내 .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
도움을 주시면 감사하겠습니다. 탱크
답변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