공통 헤더를 사용하여 두 파일의 줄을 병합하는 방법은 무엇입니까?

공통 헤더를 사용하여 두 파일의 줄을 병합하는 방법은 무엇입니까?

두 파일의 헤더로 존재하는 공통 데이터를 기반으로 두 파일을 병합하고 싶습니다.

다음은 예입니다.

파일 1

>Feature scaffold1
1   100  g
101 200  g
201 300  g
>Feature scaffold2
1   100  g
01  500  g
>Feature scaffold3
10  500  g
>Feature scaffold4
10  300  g

파일 2

>Feature scaffold1
500 500 r
900 1000    r
>Feature scaffold2
200 300 r
>Feature scaffold3
100 200 r
>Feature scaffold4
500 600 r
>Feature scaffold5
1   1000    r

이것이 내가 원하는 결과입니다:

>Feature scaffold1
1   100 g
101 200 g
201 300 g
500 500 r
900 1000    r
>Feature scaffold2
1   100 g
01  500 g
200 300 r
>Feature scaffold3
10  500 g
100 200 r
>Feature scaffold4
10  300 g
500 600 r
>Feature scaffold5
1   1000    r

awk와 sed를 시도했지만 분명히 성공하지 못했습니다. 어떻게 해야 합니까?

답변1

Awk해결책:

awk '/^>/{ k=$1 FS $2 }
     NR==FNR{ 
         if (!/^>/) a[k]=(a[k]!="")? a[k] ORS $0: $0; next
     }
     k in a{ 
         print $0 ORS a[k]; delete a[k]; next 
     }1' file1 file2
  • /^>/{ k=$1 FS $2 }- 마주쳤을 때머리글line(ie) - 첫 번째 및 두 번째 필드에서 >Feature ...키를 형성합니다.k$1$2
  • NR==FNR{ ... }- 첫 번째 입력 파일( file1)을 처리합니다.
    • if (!/^>/) a[k]=(a[k]!="")? a[k] ORS $0: $0- 축적하다헤더가 아닌a현재 키를 사용하여 행을 배열에 넣습니다.k
    • next- 다음 레코드로 이동
  • k in a- 레코드를 기반으로 한 현재 키가 ( 레코드 기반 ) file2배열에 있는 경우:afile1
    • print $0 ORS a[k]- 관련 기록 인쇄
    • delete a[k]- 처리된 항목 삭제

산출:

>Feature scaffold1
1   100  g
101 200  g
201 300  g
500 500 r
900 1000    r
>Feature scaffold2
1   100  g
01  500  g
200 300 r
>Feature scaffold3
10  500  g
100 200 r
>Feature scaffold4
10  300  g
500 600 r
>Feature scaffold5
1   1000    r

답변2

다른 방법으로 더 간단하게 만드십시오.

grep -v '^scaffold' <(awk -v RS='>Feature ' \
    'NF{s[$1]=s[$1]$0} END{for (x in s)print RS""s[x]}' file[12])

관련 정보