如何通过具有共同的标题来合并两个文件的行?

如何通过具有共同的标题来合并两个文件的行?

我想根据两个文件中作为标头存在的通用数据合并两个文件。

以下是示例

文件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])

相关内容