LINUX.ORG.RU

bash - найти вхождения в файл


0

1

Приветствую! Вот не могу сообразить:
есть два файла, первый вида:
1
2
3
4
5
Нужно:
вывести в другой файл все строки из второго, в которых вcтречаются строки из первого + слово(например, test) Например:
1 файл
123
456
789

2 файл
aaa gdfgd 333 123 test
aaa ffds 333 345 test
aaa fsf 434 789 test
aaa 4gdf 453 789 test1

Слово test
На выходе должно получиться:
aaa gdfgd 333 123 test
aaa fsf 434 789 test

Прошу совета
Я правильно думаю что это надо реализовывать через sed?



Последнее исправление: CepbIu (всего исправлений: 1)
Ответ на: комментарий от geekless

тоже как вариант
можно пример? не особо силён в этих языках
я понимаю что нужно построчно прочитать файл, найти входжение, записать строку, проверить на наличие слова и записать

CepbIu
() автор топика
Ответ на: комментарий от CepbIu

Набросал псевдокод на Руби. Работоспособность не проверял.

# Читаем файл со списком ключей, заполняем хэш:
search_keys = {}
IO.read(filename1).each_line { |line| search_keys[line.strip] = 1 }

# Читаем и фильтруем stdin:
STDIN.read.each_line do |line|
	line = line.strip.split(' ')
	puts line.join(' ') if line[4] == 'test' && search_keys.has_key?(line[3])
end
geekless ★★
()
Ответ на: комментарий от geekless

Хотя изменение полей строки не требуется же, поэтому лучше без join-а:

STDIN.read.each_line do |line|
   l = line.strip.split(' ')
   puts line if l[4] == 'test' && search_keys.has_key?(l[3])
end

geekless ★★
()
Ответ на: комментарий от CepbIu

Или у тебя в произвольном месте строки могут стоять данные? Тогда либо длиииииинную регулярку нарисовать, либо перебирать в цикле элементы l в моём примере.

geekless ★★
()
Ответ на: комментарий от geekless

мне может быть не известно где оно
алгоритм я сам написал выше

CepbIu
() автор топика
Ответ на: комментарий от CepbIu

Регулярка

Осторожно, быдлокод!

"(" + IO.read(filename).each_line.select {|v| v.strip != «» } .map {|v| Regexp.quote v.strip} .join(«|») + ")\stest"

geekless ★★
()
Ответ на: комментарий от CepbIu

Так как Вам нужно чтобы последовательности символов во втором файле были отделены от остальных пробелами, то можно так:

grep -wf file1.txt file2.txt | grep -w test >> file3.txt

Sinensis
()
Ответ на: комментарий от CepbIu

все там правильно, ищите ошибки в том, как вы перепечатали команду. Скорее всего вы упустили -f в первом грепе.

silw ★★★★★
()
Ответ на: комментарий от silw

grep -f file1.txt file2.txt | grep -w test >> file3.txt работает
если в первом поставить w - то нет

CepbIu
() автор топика
Ответ на: комментарий от Shtucer

Ну я думал, ТСу нужно искать по полям, а не вхождения в любом месте строки.

geekless ★★
()
Ответ на: комментарий от Shtucer

можно по подробнее? мне уже хочется понять логику человека, почему он захотел писать ~10 строк кода, вместо того что бы воспользоваться тем что уже изначально есть

CepbIu
() автор топика
Ответ на: комментарий от CepbIu

Логика проста, иногда кроме шелла с грепом, седом и авк нету ничего.

Shtucer
()
Ответ на: комментарий от val-amart

можно и на чистом шелле, в принципе, без грепа и седа

Но зачем когда есть ruby ^W grep && sed?

babusha
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.