Tìm mẫu từ một tệp được liệt kê trong tệp khác


15

Tôi muốn tìm các mẫu được liệt kê trong một tệp và tìm thấy chúng trong tệp khác. Tệp thứ hai có các mẫu được phân tách bằng dấu phẩy.

ví dụ tập tin đầu tiên F1 có gen

ENSG00000187546
ENSG00000113492  
ENSG00000166971

và tệp thứ hai F2 có các gen đó cùng với một số cột khác (năm cột) mà tôi cần

 region     gene           chromosome  start       end

 intronic   ENSG00000135870 1   173921301   173921301
intergenic  ENSG00000166971(dist=56181),ENSG00000103494(dist=37091) 16 53594504    53594504
ncRNA_intronic  ENSG00000215231 5   5039185 5039185
intronic    ENSG00000157890 15  66353740    66353740

Vì vậy, gen ENSG00000166971 có trong tệp thứ hai không hiển thị trong grep vì nó có một gen khác với nó, được phân tách bằng dấu phẩy.

Mã của tôi là:

grep -f "F1.txt" "F2.txt" >output.txt

Tôi muốn những giá trị đó ngay cả khi một trong số chúng có mặt và dữ liệu liên quan với nó. Có cách nào để làm điều này không?


1
Có thể là việc bạn thực hiện grepneo các mẫu của nó theo mặc định? Có grep -f <(echo a) <(echo 'a,b')sản xuất bất kỳ đầu ra?
Joseph R.

Câu trả lời:


11

Bạn grepđang sử dụng phiên bản nào? Tôi đã thử mã của bạn và nhận được kết quả như sau:

$ grep -f file1 file2
ENSG00000187546
ENSG00000113492
ENSG00000166971,ENSG00000186106

Nếu bạn chỉ muốn kết quả phù hợp, bạn có thể sử dụng công tắc grepcủa mình -ođể chỉ báo cáo những điều phù hợp:

$ grep -o -f file1 file2 
ENSG00000187546
ENSG00000113492
ENSG00000166971

phiên bản grep

$ grep --version
grep (GNU grep) 2.14
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

Nhân vật đi lạc trong F1.txt?

Trong khi gỡ lỗi này hơn nữa tôi nhận thấy một số khoảng trắng ở cuối dòng thứ 2 trong tệp F1.txt. Bạn có thể thấy chúng bằng cách sử dụng hexdump.

$ hexdump -C ff1
00000000  45 4e 53 47 30 30 30 30  30 31 38 37 35 34 36 0a  |ENSG00000187546.|
00000010  45 4e 53 47 30 30 30 30  30 31 31 33 34 39 32 20  |ENSG00000113492 |
00000020  20 0a 45 4e 53 47 30 30  30 30 30 31 36 36 39 37  | .ENSG0000016697|
00000030  31 0a                                             |1.|
00000032

Chúng hiển thị với mã ASCII 20. Bạn có thể thấy chúng trong đó : 32 20 20 0a.


1
grep --version GNU grep 2.6.3 Bản quyền (C) 2009 Free Software Foundation, Inc. Giấy phép GPLv3 +: GNU GPL phiên bản 3 trở lên < gnu.org/licenses/gpl.html > Đây là phần mềm miễn phí: bạn có thể tự do thay đổi và phân phối lại nó. KHÔNG CÓ BẢO HÀNH, trong phạm vi được pháp luật cho phép. Tôi chỉ nhận được các kết quả khớp nếu chúng tồn tại dưới dạng cá nhân chứ không phải như bạn đã nói. Thật lạ, trận đấu duy nhất tôi nhận được là mẫu cuối cùng từ tệp chứa các mẫu được khớp.
Ron

1
Tôi đã dán phiên bản đầy đủ hơn của tệp thứ hai của mình mặc dù có ít hàng hơn và đã cố gắng tìm kiếm nó. Nó không khớp với hàng thứ hai từ tệp thứ hai
Ron

1
@Ron - Bạn có các ký tự đi lạc ở cuối chuỗi trong tệp F1.txt gây ra sự cố của bạn. Chỉ cần xác nhận rằng nó hoạt động tốt trên grep (GNU grep) 2.5.1
slm

1
Tôi vừa lưu tệp trong wrangler văn bản ở định dạng Unix-LF, và bây giờ nó hoạt động !!
Ron

2
@Ron - vâng, niềm vui của khoảng trắng 8-)
slm
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.