Temukan pola dari satu file yang terdaftar di file lain


15

Saya ingin menemukan pola yang tercantum dalam satu file dan menemukannya di file lain. File kedua memiliki pola-pola itu dipisahkan oleh koma.

untuk misalnya file pertama F1 memiliki gen

ENSG00000187546
ENSG00000113492  
ENSG00000166971

dan file kedua F2 memiliki gen-gen itu bersama dengan beberapa kolom lagi (lima kolom) yang saya butuhkan

 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

Jadi gen ENSG00000166971 yang ada di file kedua tidak muncul di grep karena memiliki gen lain dengan itu, dipisahkan oleh koma.

Kode saya adalah:

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

Saya ingin nilai-nilai itu bahkan jika salah satunya ada, dan data yang terkait dengannya. Apakah ada cara untuk melakukan ini?


1
Mungkinkah implementasi grepanchor pola Anda secara default? Apakah grep -f <(echo a) <(echo 'a,b')menghasilkan output?
Joseph R.

Jawaban:


11

Versi apa grepyang Anda gunakan? Saya mencoba kode Anda dan mendapatkan hasil berikut:

$ grep -f file1 file2
ENSG00000187546
ENSG00000113492
ENSG00000166971,ENSG00000186106

Jika Anda hanya ingin hasil yang sesuai dengan Anda dapat menggunakan grep's -oberalih untuk melaporkan hanya hal-hal yang terkait:

$ grep -o -f file1 file2 
ENSG00000187546
ENSG00000113492
ENSG00000166971

versi 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>.

Karakter liar di F1.txt?

Sambil men-debug ini lebih lanjut, saya perhatikan beberapa ruang nyasar di akhir baris ke-2 dalam file F1.txt. Anda dapat melihatnya menggunakan 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

Mereka muncul dengan sebagai kode ASCII 20. Anda dapat melihat mereka di sini: 32 20 20 0a.


1
grep --versi GNU grep 2.6.3 Hak Cipta (C) 2009 Free Software Foundation, Inc. Lisensi GPLv3 +: GNU GPL versi 3 atau lebih baru < gnu.org/licenses/gpl.html > Ini adalah perangkat lunak gratis: Anda bebas untuk mengubah dan mendistribusikannya kembali. TIDAK ADA GARANSI, sejauh diizinkan oleh hukum. Saya hanya mendapatkan korek api jika ada sebagai individu dan bukan seperti yang Anda katakan. Anehnya, satu-satunya korek yang saya dapatkan adalah pola terakhir dari file yang berisi pola-pola yang akan dicocokkan.
Ron

1
Saya telah menyisipkan versi yang lebih lengkap dari file kedua saya walaupun dengan lebih sedikit baris, dan mencoba mencarinya. Itu tidak cocok dengan baris kedua dari file kedua
Ron

1
@ Ron - Anda memiliki karakter liar di akhir string di file F1.txt yang menyebabkan masalah Anda. Hanya mengkonfirmasi itu berfungsi dengan baik pada grep (GNU grep) 2.5.1
slm

1
Saya baru saja menyimpan file dalam pengatur teks dalam format Unix-LF, dan sekarang berfungsi !!
Ron

2
@Ron - ya kesenangan dari whitespace 8-)
slm
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.