Есть ли более быстрый способ получить этот выходной файл в 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 , в то время как цикл занимает время

2 Solutions collect form web for “Есть ли более быстрый способ получить этот выходной файл в Linux?”

Вы можете использовать конструкцию 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 . Если это так, мы печатаем строку и удаляем ключ.

  • Как мне искать файл для строки, а затем использовать его как переменную?
  • Как преобразовать данные с разделителями табуляции в данные с разделителями-запятыми?
  • Поиск файла для строки, окруженной двумя другими известными строками?
  • Узнайте, на какой строке в текстовом файле соответствует слово
  • Преобразование таблицы csv в HTML
  • Извлечение URL из неформатированного текста
  • Замените в верхнем регистре на нижний регистр, кроме первой буквы каждого слова в определенной строке
  • Застрял в разделении символов на строки в моем подходе. Нашел рабочий подход, но не может его понять
  • попытка добавить текст до и после некоторого текста
  • Копировать только Конкретный текст файла в другой
  • Найти и заменить с помощью sed с помощью подстановочных знаков при поиске и замене
  • Interesting Posts

    Lvm, показывающий в режиме ожидания

    Как назначить ключевой ярлык для перемещения рабочих пространств GNOME 3 вверх / вниз?

    В чем разница между kill, pkill и killall

    mount: warning: / etc / mtab не доступен для записи (например, файловая система только для чтения)

    Приоритетная маршрутизация с мостами macvtap

    Как использовать Quicken Home Inventory в Linux (или Windows 7)

    unkillable / unstoppable нормальный пользовательский процесс, как принудительно контролировать его?

    SIOCSIFNETMASK: неверный аргумент с использованием OpenVPN на Ubuntu

    Не удается заставить Tiger-Vnc работать на Fedora 21

    Каков 6-й символ хэша паролей в Linux, и почему он часто является косой чертой?

    Интерфейс для Linux для диапазона IP для деления входящего трафика

    Как изменить фокус в X-окне на терминале

    заставлять RPM распознавать зависимость, построенную из источника

    Как «найти» несколько файлов и открыть их в vim?

    Как изменить основную группу?

    Linux и Unix - лучшая ОС в мире.