Скористайтеся списком слів, щоб простукувати в іншому списку


8

У мене є список з 250 рядками. Мені потрібно запустити їх через веб-сервер, щоб отримати список результатів. Однак цей список повертає набагато більше рядків, ніж мене цікавить. Скажіть, мій list.txt:

a.1
b.1
etc

то вихід output.txt:

a.1 a b c
a.2 b a b
a.3 d k o
b.1 b o p
b.2 o i y
b.3 p i y
etc

Чи можна використовувати команду grep для пошуку всіх слів у list.txt у output.txt, а потім генерування "шуканого" списку шуканих.txt? Мені потрібен цілий рядок у моєму файлі output.txt Я новачок у написанні сценаріїв, але те, що мені б хотілося, - щось таке

grep list.txt output.txt > wanted.txt

Я не зміг знайти жодного прикладу цього


Вони обидва в алфавітному порядку, як ваші приклади?
Олі

Ні, у мене в списку є певний не алфавітний порядок у моєму списку.txt, але output.txt є алфавітним, але я хотів би, щоб він містив лише "хіти" для мого list.txt у тому ж неабетковому порядку
Дітте

Відповіді:


11

Я б ігнорував grepце. Це добре для регулярних виразів, але не схоже, що вам тут справді потрібно. commможна порівняти два файли та показати вам перехрестя. Використовуючи ваші точні приклади:

$ comm -12 list.txt output.txt 
a.1
b.1
etc

Це швидше, ніж будь-яка греп, але це покладається (значно) на сортування файлів. Якщо їх немає, ви можете їх сортувати заздалегідь, але це змінить вихід, щоб він також був відсортований.

comm -12 <(sort list.txt) <(sort output.txt) 

Крім того, ця відповідь від iiSeymour дозволить вам це зробити grep. Прапори запитують вхідний файл і примушують шукати повне слово фіксованим рядком. Це не покладається на замовлення, але базуватиметься на output.txtзамовленнях. Переверніть файли, якщо ви хочете їх у порядку list.txt.

$ grep -wFf list.txt output.txt 
a.1
b.1
etc

Якщо ваш list.txtє дійсно великим, то ви , можливо , доведеться вирішувати цю трохи більше итеративно і передати кожен рядок Grep окремо. Це значно збільшить час обробки. У наведеному вище ви читали б output.txtодин раз, але таким чином ви читали б і обробляли його для кожного рядка list.txt. Це жахливо ... Але це може бути ваш єдиний вибір. Зверху, вона потім сортує речі за list.txtнаказом.

$ while read line; do grep -wF "$line" output.txt; done < list.txt
a.1
b.1
etc

1
Це справді розумно! У чому причина -12?
Дітте

3
-1пригнічує рядки, унікальні для першого файлу, -2придушує рядки, унікальні для другого файлу, і -3пригнічує рядки, спільні для обох. Щоб отримати лише загальні лінії, ми придушуємо унікальність, отже -12.
Олі

приємно! Я думаю, я використаю команду comm. І тоді, коли я хочу сортувати output.txt, щоб він був таким самим, як list.txt, я просто використаю згодом comm -12 <(сортувати список.txt) <(сортувати вихід.txt)?
Дітте

Команда comm не дала мені весь рядок у result.txt (і мені це потрібно для отримання інформації звідти). Але якщо я спробую команду grep, вона запропонує мені grep: поза пам'яттю. Це означає, що вона занадто велика?
Дітте

2-й приклад має надмірне перенаправлення STDIN, оболонка позначиться як помилка. або створюйте тимчасові файли або використовуйте додатковий fd з фоновим сортом, який прокладений до нього (хитрий у більшості оболонок) ... це більше питання програмування, що краще задавати на Stack Overflow . особисто я би робив це в python.
Скаперен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.