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 cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.