여러 관련 파일의 줄을 한 줄로 연결하고 출력 파일에 추가하는 방법

여러 관련 파일의 줄을 한 줄로 연결하고 출력 파일에 추가하는 방법

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개행 문자를 인쇄하는 부분이 첫 번째 파일 뒤에 도착하기 때문입니다. .

관련 정보