Làm cách nào tôi có thể hợp nhất các dòng của hai tệp bằng cách có các tiêu đề chung?


8

Tôi muốn hợp nhất hai tệp dựa trên dữ liệu phổ biến có trong chúng làm tiêu đề.

Sau đây là ví dụ

Tệp1

>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

Tập tin 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

Và đây là loại đầu ra tôi muốn:

>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

Tôi đã thử một số awk và sed nhưng rõ ràng không thành công, làm thế nào tôi có thể làm điều này?

Câu trả lời:


7

Awk giải pháp:

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 }- trên gặp phải tiêu đề dòng (ví dụ >Feature ...) - soạn một chìa khóa ktừ ngày 1 $1và 2 $2lĩnh vực
  • NR==FNR{ ... }- xử lý tệp đầu vào thứ 1 ( file1):
    • if (!/^>/) a[k]=(a[k]!="")? a[k] ORS $0: $0- tích lũy các dòng không tiêu đề thành mảng abằng khóa hiện tạik
    • next - nhảy đến kỷ lục tiếp theo
  • k in a- nếu khóa hiện tại dựa trên file2bản ghi nằm trong mảng a(dựa trên file1bản ghi):
    • print $0 ORS a[k] - in hồ sơ liên quan
    • delete a[k] - xóa (các) mục đã xử lý

Đầu ra:

>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

4

Một cách tiếp cận khác và để làm cho nó đơn giản hơn.

grep -v '^scaffold' <(awk -v RS='>Feature ' \
    'NF{s[$1]=s[$1]$0} END{for (x in s)print RS""s[x]}' file[12])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.