두 파일의 헤더로 존재하는 공통 데이터를 기반으로 두 파일을 병합하고 싶습니다.
다음은 예입니다.
파일 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
배열에 있는 경우:a
file1
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])