ค้นหารูปแบบจากไฟล์หนึ่งที่อยู่ในรายการอื่น


15

ฉันต้องการค้นหารูปแบบที่ระบุไว้ในไฟล์เดียวและค้นหาในไฟล์อื่น ไฟล์ที่สองมีรูปแบบเหล่านั้นคั่นด้วยเครื่องหมายจุลภาค

สำหรับเช่นไฟล์แรก F1 มียีน

ENSG00000187546
ENSG00000113492  
ENSG00000166971

และไฟล์ที่สอง F2 มียีนเหล่านั้นพร้อมกับคอลัมน์เพิ่มเติม (ห้าคอลัมน์) ที่ฉันต้องการ

 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

ดังนั้นยีน ENSG00000166971 ซึ่งมีอยู่ในไฟล์ที่สองไม่แสดงเป็น grep เพราะมันมียีนอื่นอยู่ด้วยโดยคั่นด้วยเครื่องหมายจุลภาค

รหัสของฉันคือ:

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

ฉันต้องการค่าเหล่านั้นแม้ว่าจะมีหนึ่งในนั้นและข้อมูลที่เกี่ยวข้องด้วยมีวิธีใดที่จะทำเช่นนี้?


1
เป็นไปได้หรือไม่ที่คุณจะนำgrepรูปแบบของแองเคอร์ไปใช้งานโดยปริยาย? ไม่grep -f <(echo a) <(echo 'a,b')ผลิตออกใด ๆ
Joseph R.

คำตอบ:


11

คุณใช้เวอร์ชั่นgrepอะไร ฉันลองใช้รหัสของคุณและรับผลลัพธ์ต่อไปนี้:

$ grep -f file1 file2
ENSG00000187546
ENSG00000113492
ENSG00000166971,ENSG00000186106

ถ้าคุณเพียงต้องการผลลัพธ์ที่ตรงกับที่คุณสามารถใช้grepของ-oสวิทช์ที่จะรายงานเฉพาะสิ่งที่แข่งขัน:

$ grep -o -f file1 file2 
ENSG00000187546
ENSG00000113492
ENSG00000166971

รุ่น 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>.

อักขระหลงทางใน F1.txt

ในขณะที่การแก้จุดบกพร่องนี้ฉันยังสังเกตเห็นช่องว่างจรจัดหลายที่ท้ายบรรทัดที่ 2 F1.txtในไฟล์ 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

พวกเขาแสดงให้ทันกับการเป็นรหัส ASCII 20. 32 20 20 0aคุณสามารถดูได้ในพวกเขาที่นี่:


1
grep --version GNU grep 2.6.3 ลิขสิทธิ์ (C) 2009 มูลนิธิซอฟต์แวร์เสรี, Inc ใบอนุญาต GPLv3 +: GNU GPL รุ่น 3 หรือใหม่กว่า < gnu.org/licenses/gpl.html > นี่เป็นซอฟต์แวร์ฟรี: คุณมีอิสระในการเปลี่ยนแปลง และแจกจ่ายซ้ำ ไม่มีการรับประกันตามขอบเขตที่กฎหมายอนุญาต ฉันจะได้รับแมตช์เท่านั้นหากพวกเขาอยู่ในฐานะปัจเจกบุคคลและไม่ใช่อย่างที่คุณพูดอย่างจริงจังการจับคู่เดียวที่ฉันได้รับคือรูปแบบสุดท้ายจากไฟล์ที่มีรูปแบบที่จะจับคู่
รอน

1
ฉันได้วางเวอร์ชันที่สมบูรณ์มากขึ้นของไฟล์ที่สองของฉันแม้ว่าจะมีแถวน้อยกว่าและพยายามค้นหามันมันไม่ตรงกับแถวที่สองจากไฟล์ที่สอง
Ron

1
@Ron - คุณมีอักขระหลงทางที่ท้ายสตริงในไฟล์ F1.txt ที่ทำให้เกิดปัญหาของคุณ เพิ่งยืนยันว่ามันทำงานได้ดีบน grep (GNU grep) 2.5.1
slm

1
ฉันเพิ่งบันทึกไฟล์ในข้อความ Wrangler ในรูปแบบ Unix-LF และตอนนี้มันใช้งานได้ !!
รอน

2
@Ron - ใช่ความสนุกของ whitespace 8-)
slm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.