Поиск строк в файле, содержащих две строки второго файла

#linux #bash

#linux #bash

Вопрос:

Итак, у меня есть первый файл с идентификатором в каждой строке, например:

 458-12-345
466-44-3-223
578-4-58-1
599-478
854-52658
955-12-32
  

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

 111-2457-1 0.2545 0.5484 0.6914 0.4222
112-4844-487 0.7475 0.4749 0.1114 0.8413
115-44-48-5 0.4464 0.8894 0.1140 0.1044
  

….

В первом файле всего 1000 строк с идентификаторами нужной мне информации, в то время как во втором файле более 200 000 строк.

Я использовал следующую команду bash в fedora с хорошими результатами:

 cat file1.txt | while read line; do cat file2.txt | egrep "^$line "; done > file3.txt
  

Однако сейчас я пытаюсь воспроизвести результаты в Ubuntu, и на выходе получается пустой файл. Есть ли причина, по которой это не работает в Ubuntu?

Спасибо!

Ответ №1:

Вы можете использовать grep для нескольких строк одновременно:

 grep -f id_file data_file
  

Предполагается, что id_file содержит все идентификаторы, а data_file — идентификаторы и данные.

Комментарии:

1. Хорошее использование grep, но не совсем подходящее для больших файлов. Только что провел некоторое тестирование на файлах в 1000 строк и 200000 строк, и awk работает примерно в два раза быстрее.

Ответ №2:

Типичная работа для awk:

 awk 'FNR==NR{i[$1]=1;next} i[$1]{print}' file1 file2
  

Это выведет строки из второго файла, которые имеют индекс в первом. Для еще большей скорости используйте mawk.

Комментарии:

1. Спасибо, это отлично работало как на Fedora, так и на Cygwin, это также действительно быстро, так что это большое улучшение. Это не сработало на моей Ubuntu, поэтому я считаю, что с этим что-то не так.

2. Должно работать на вашем Ubuntu. Это должно работать даже со старым добрым традиционным awk 1977 года. Выдает ли это какую-либо ошибку?

Ответ №3:

эта строка отлично работает для меня в Ubuntu:

 cat 1.txt | while read line; do cat 2.txt | grep "$line"; done
  

Однако это может быть медленным, поскольку второй файл (200000 строк) будет повторен 1000 раз (количество строк в первом файле)