#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 раз (количество строк в первом файле)