Извлечь строки в текстовом файле с помощью grep

У меня есть файл .txt с именами по одному в строке, как показано ниже:

ABCB8
ABCC12
ABCC3
ABCC4
AHR
ALDH4A1
ALDH5A1
....

Я хочу получить каждый из них из файла input.txt.

Вручную я делаю это по одному, как

grep "ABCB8" input.txt > output.txt

Может ли кто-нибудь помочь автоматически собрать все строки в файле.txt из input.txt и записать их в output.txt.


person chas    schedule 25.06.2013    source источник


Ответы (2)


for line in `cat text.txt`; do grep $line input.txt >> output.txt; done

Содержание text.txt:

ABCB8
ABCC12
ABCC3
ABCC4
AHR
ALDH4A1
ALDH5A1

Изменить:

Более безопасное решение с while read:

cat text.txt | while read line; do grep "$line" input.txt >> output.txt; done

Редактировать 2:

Образец text.txt:

ABCB8
ABCB8XY
ABCC12

Образец input.txt:

You were hired to do a job; we expect you to do it.
You were hired because ABCB8 you kick ass;
we expect you to kick ass.
ABCB8XY You were hired because you can commit to a rational deadline and meet it;
ABCC12 we'll expect you to do that too.
You're not someone who needs a middle manager tracking your mouse clicks

Если вас не волнует порядок строк, быстрым обходным решением будет передача решения через sort | uniq:

cat text.txt | while read line; do grep "$line" input.txt >> output.txt; done; cat output.txt | sort | uniq > output2.txt

Результат тогда в output.txt.

Редактировать 3:

 cat text.txt | while read line; do grep "\<${line}\>" input.txt >> output.txt; done

Это нормально?

person Adobe    schedule 25.06.2013
comment
Цикл for не подходит для этого. Прочтите Почему вы не читаете строки с for. Плюс grep уже зацикливается на входном файле. - person Édouard Lopez; 25.06.2013
comment
@EdouardLopez: я знаю, но в этом простом примере это не имеет значения. Во всяком случае, у меня никогда не было проблем с использованием while read. - person Adobe; 25.06.2013
comment
Вы распространяете плохие практики, вы while/for бесполезны, вы пытаетесь подражать поведению или grep (зацикливая каждую строку файла) передать их… grep. - person Édouard Lopez; 25.06.2013
comment
Пожалуйста, изложите свой подход более четко: создайте второй файл, содержащий список шаблонов, используйте его в качестве входных данных для grep. Это также неудобно, поскольку файл, на котором вы основываете свой подход, является результатом, который ищет @user1779730. Следовательно, ваше решение основано на самом себе (бесконечный цикл: S) - person Édouard Lopez; 25.06.2013
comment
@EdouardLopez: я думал, что строки для grep находятся в файле text.txt. И, как я понял, OP - он запрашивает цикл. - person Adobe; 25.06.2013
comment
@Adobe Оба решения с использованием цикла while и for дают пустой вывод. - person chas; 25.06.2013
comment
@ user1779730: не вижу причины. Я мог бы попробовать и сам посмотреть, если бы Вы выложили образец input.txt - person Adobe; 25.06.2013
comment
@Adobe Привет, теперь все работает нормально. Но у меня есть другая проблема. Например, если мы grep «ABCB8», он выдает результат, если есть «ABCB8XY». Мне нужно grep тогда и только тогда, когда он соответствует точной строке «ABCB8». - person chas; 25.06.2013
comment
@ user1779730: Ты свободен во времени? Вернусь к Вашей проблеме часов через 10-20? - person Adobe; 25.06.2013
comment
Для отрицательных: я знаю, что это бесполезное использование кота и цикла, и все это можно сделать в одном канале grep. НО -- в большинстве случаев скорость не является проблемой, в то время как знание 100 000 опций coreutils является проблемой, если у вас есть другие вещи, за которые вы отвечаете. Так почему бы просто не запрограммировать то, что под рукой? - person Adobe; 08.07.2013

Вы можете использовать флаг -f, как описано в Bash, Linux, необходимо удалить строки из одного файла на основе соответствия содержимого из другого файла

grep -o -f file.txt input.txt > output.txt

Флаг

  • -f FILE, --file=FILE:

Получить шаблоны из ФАЙЛА, по одному на строку. Пустой файл не содержит шаблонов и поэтому ничему не соответствует. (-f определяется POSIX.)

  • -o, --only-matching:

Печатать только совпадающие (непустые) части совпадающей строки, причем каждая такая часть находится в отдельной строке вывода.

person Édouard Lopez    schedule 25.06.2013
comment
Я получил файл input.txt с выделенными строками от file.txt - person Édouard Lopez; 25.06.2013
comment
Попробуйте без > output.txt. Обратите внимание, что file.txt содержит список файлов шаблонов, input.txt — это файл для просмотра. - person Édouard Lopez; 25.06.2013