BC**-tmp1.tsv
폭발 출력의 첫 번째 반복이라는 이름의 여러 파일과 BC**-tmp2.tsv
두 번째 반복 이라는 이름의 다른 파일이 있습니다 .
파일 예 BC02-tmp1.tsv
(구분자 \t
: ):
BC02 Aaa 2712 94 0 99.073 2053209 CP023507.1 1597 A
BC02 Bbb 2712 94 0 99.073 2053209 CP023507.1 1597 B
BC02 Ccc 2712 94 0 99.073 2053209 CP023507.1 1597 C
BC02 Ddd 2712 94 0 99.073 2053209 CP023507.1 1597 D
파일 예 BC02-tmp2.tsv
(구분자 \t
: ):
BC02 Eee 2712 94 0 99.073 2053209 CP023507.1 1597 E
BC02 Fff 2712 94 0 99.073 2053209 CP023507.1 1597 F
BC02 Ggg 2712 94 0 99.073 2053209 CP023507.1 1597 G
BC02 Hhh 2712 94 0 99.073 2053209 CP023507.1 1597 H
내 목표는 특정 방식으로 이러한 모든 파일을 쌍(반복 1 + 반복 2)으로 결합하는 것입니다.
BC02
결과 예와 최종 파일의 예:
BC02 Aaa 2712 94 0 99.073 2053209 CP023507.1 1597 A B C BC02 Eee 2712 94 0 99.073 2053209 CP023507.1 1597 E F G
따라서 더 정확하게는 파일의 첫 번째 줄을 (같은 줄에) 인쇄하고 BC**-tmp1.tsv
, 두 번째 줄의 마지막 열, 세 번째 줄의 마지막 열, 파일의 첫 번째 줄 BC**-tmp2.tsv
, 그리고 The 두 번째 행의 마지막 열, 세 번째 행의 마지막 열입니다. 각 바코드 쌍에도 동일하게 적용됩니다.
노트: 두 번째 반복 파일이 항상 존재하는 것은 아닙니다.
지금까지 쉘 루프에서 관련 파일을 수집했지만 for
나머지는 어떻게 수행해야 할지 모르겠습니다.
touch template.tsv
for bla in *-tmp1.tsv; do
r="$(basename -s "-tmp1.tsv" $bla)"
awk 'FNR==1' $bla >> template.tsv
awk 'FNR==1' $r-tmp2.tsv >> template.tsv;
done
어떻게 하는지 아시나요?
더 간단한 입력/출력을 위해 편집합니다.
입력하다:
$ head BC02-tmp*.tsv
==> BC02-tmp1.tsv <==
a b B
a c C
a d D
a e E
==> BC02-tmp2.tsv <==
a w W
a x X
a y Y
a z Z
산출:
a b B C D a w W X Y
답변1
입력에 특별한 경우가 없다고 가정하면 프로그램에 연결된 다음 셸 루프는 awk
다음을 수행해야 합니다.
for f in BC*-tmp1.tsv
do
f2="${f/%tmp1.tsv/tmp2.tsv}"
if [[ ! -f $f2 ]]; then f2=""; fi
awk 'BEGIN{FS=OFS="\t"}
FNR==1{for (i=1;i<NF;i++) printf "%s%s",(NR==FNR&&i==1?"":OFS),$i}
FNR<=3{printf "%s%s",OFS,$NF}
END{printf "%s",ORS}' "$f" "$f2" >> template.tsv
done
tmp1.tsv
그러면 모든 파일을 반복 하고 tmp2.tsv
해당 파일에 해당하는 파일 이름을 생성합니다. 두 번째 파일이 없으면 파일 이름은 빈 문자열로 설정됩니다.
awk
그런 다음 인쇄할 두 개의 연결된 TSV 파일이 있는 프로그램을 호출합니다 . 모두 같은 줄에 있습니다.
- 각 입력 파일의 첫 번째 줄의 모든 필드(마지막 필드 제외)(그러나 두 번째 입력 파일의 경우 앞에 추가 OFS가 있고
FNR
파일당 줄 카운터가 더 이상NR
전역 줄 과 동일하지 않음) 카운터), - 3행까지 각 행의 마지막 필드,
- 입력 파일이 남아 있지 않을 때 종료 레코드 구분 기호(기본값은 개행)
두 번째 템플릿 파일이 존재하지 않는 경우 에도 template.tsv
작동합니다. 왜냐하면 빈 문자열 토큰은 awk
처음에 입력 파일로 인식되지 않으므로 END
개행 문자를 인쇄하는 부분이 첫 번째 파일 뒤에 도착하기 때문입니다. .