我想根据两个文件中作为标头存在的通用数据合并两个文件。
以下是示例
文件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])