2016-11-27 27 views
6

Tôi có một tập dữ liệu với 20 000 đầu dò, chúng có hai cột, mỗi 21 cột. Từ tập tin này tôi cần trích xuất các dòng trong đó nucleotide cuối cùng trong cột Probe1 khớp với nucleotide cuối cùng trong cột Probe 2. Cho đến nay tôi đã thử hàm AWK (substr), nhưng không nhận được kết quả mong đợi. Dưới đây là một liner tôi đã cố gắng:Làm thế nào để so sánh hai chuỗi trong một dòng

awk '{if (substr($2,21,1)==substr($4,21,1)){print $0}}' 

Một lựa chọn khác sẽ được neo ký tự cuối cùng trong cột 2 và 4 (awk '$2~/[A-Z]$/), nhưng tôi không thể tìm thấy một cách để phù hợp với đầu dò trong hai cột sử dụng regex. Tất cả các đề xuất và ý kiến ​​sẽ được đánh giá rất nhiều.

Ví dụ về dữ liệu:

 Probe 1      Probe 2 
4736 GGAGGAAGAGGAGGCGGAGGA A GGAGGACGAGGAGGAGGAGGA 
4737 GGAGGAAGAGGAGGGAGAGGG B GGAGGACGAGGAGGAGGAGGG 
4738 GGAGGATTTGGCCGGAGAGGC C GGAGGAGGAGGAGGACGAGGT 
4739 GGAGGAAGAGGAGGGGGAGGT D GGAGGACGAGGAGGAGGAGGC 
4740 GGAGGAAGAGGAGGGGGAGGC E GGAGGAGGAGGACGAGGAGGC 

đầu ra mong muốn:

4736 GGAGGAAGAGGAGGCGGAGGA A GGAGGACGAGGAGGAGGAGGA 
4737 GGAGGAAGAGGAGGGAGAGGG B GGAGGACGAGGAGGAGGAGGG 
4740 GGAGGAAGAGGAGGGGGAGGC E GGAGGAGGAGGACGAGGAGGC 
+4

Ví dụ 'awk' bạn đưa ra đã tạo ra kết quả mong muốn mà bạn đã mô tả. Bạn cần thêm gì nữa à? – janos

+0

Nó hoạt động thực sự, xin lỗi vì nhầm lẫn. – Bio21

Trả lời

5

này sẽ lọc đầu vào, phù hợp với dòng mà ký tự cuối cùng của cột thứ 2 là tương đương với ký tự cuối cùng của 4 cột:

awk 'substr($2, length($2), 1) == substr($4, length($4), 1)' 

Điều tôi đã thay đổi so với tập lệnh mẫu:

  • Di chuyển báo cáo kết quả if ra khỏi khối { ... } vào một bộ lọc
  • Sử dụng length($2)length($4) thay vì thể xác định rõ giá trị 21
  • Các { print $0 } là không cần thiết, vì đó là hành động mặc định cho các dòng phù hợp
Các vấn đề liên quan