Intereting Posts
Удаление пробелов из полей в файле с разделителями с запятой с использованием сценария оболочки Могу ли я безопасно игнорировать: «предупреждение: подстановка команды: игнорируется нулевой байт на входе»? только вывод, когда первые столбцы одинаковы Jumping ssh хосты без netcat Попытка преобразовать сценарий инициализации RHEL6 в systemd Если компьютеры начинают отсчет в 0, почему процесс init имеет pid из 1? Процесс Kondemand потребляет большую часть моего процессора Использование списка с разделителями строк в качестве параметра Как я могу смотреть Netflix на Linux? Rc.local не работает правильно команд почему репозиторий debian не содержит lokkit? Сортировка файлов изображений с использованием информации заголовка Воспроизведение звука при приостановке и возобновлении воспроизведения OpenLdap – восстановление резервной копии – slapcat / slapadd Как настроить «максимальные открытые файлы» и жесткий лимит для определенного процесса?

Есть ли более быстрый способ получить этот выходной файл в Linux?

cat file_1 my colour is red my rose is red my colour is blue my rose id blue cat file_2 red blue cat output_file should be my colour is red my colour is blue 

здесь я использую

 cat file_2 | while read line;do cat file_1 | grep "$line" | head -1;done 

здесь я пытаюсь получить самую верхнюю строку, содержащую pattern "red" and "blue" который присутствует в file_2

есть ли другой способ сделать, as fast as possible , в то время как цикл занимает время

Вы можете использовать конструкцию while для перебора шаблонов из file2 а затем использовать -m 1 с grep для остановки после первого совпадения file1 :

 while IFS= read -ri; do grep -Fm1 "$i" file1; done <file2 
  • -F трактует шаблон буквально
  • -m 1 заставляет grep выйти после первого совпадения

Шлейфы обычно неэффективны, но, учитывая, что список шаблонов мал, он может использоваться в этом случае.

Более быстрая альтернатива , xargs :

 xargs -a file2 -n1 -P2 -I'{}' grep -Fm1 {} file1 

Используйте больше параллельных процессов ( -P ) для большего количества шаблонов.

Пример:

 % while IFS= read -ri; do grep -Fm1 "$i" file1; done <file2 my colour is red my colour is blue % xargs -a file2 -n1 -P2 -I'{}' grep -Fm1 {} file1 my colour is blue my colour is red 

Чтобы напечатать первую строку из файла_1, которая соответствует строке в файле_2:

 $ awk 'FNR==NR{a[$0];next} {for (line in a) if ($0~line) {print; delete a[line]}}' file_2 file_1 my colour is red my colour is blue 

Этот подход читает каждый файл только один раз.

Как это работает

  • FNR==NR{a[$0];next}

    Это сохраняет каждую строку в файле_2 как ключ в ассоциативном массиве a .

  • for (line in a) if ($0~line) {print; delete a[line]}

    Для каждой строки в файле_1 мы проверяем, соответствует ли он ключу в массиве a . Если это так, мы печатаем строку и удаляем ключ.