Трубопровод нескольких строк в сценарии bash

У меня есть несколько сложных журналов, которые я пытаюсь проанализировать. Я хочу найти строку H , получить столбец 5 из строки, которая соответствует, а затем взять все остальные строки, где столбец 5 соответствует строке со строкой H.

Пример ввода

abcd 31 1 abcd 31 H abcd 31 2 abcd 32 1 abdd 32 2 abcd 33 1 abcd 33 H abcd 33 2 

Ожидаемый результат

 abcd 31 1 abcd 31 H abcd 31 2 abcd 33 1 abcd 33 H abcd 33 2 

Итак, я смог сделать это, script1 | xargs -n1 | script2 два отдельных сценария: script1 | xargs -n1 | script2 script1 | xargs -n1 | script2

script1 ищет строку H , а затем печатает пятый столбец.
cat logfile | grep 'H' | awk '{print $5}'

script2 затем печатает все остальные строки из файла журнала, где столбец 5 соответствует выходному сигналу первого скрипта: cat logfile | awk -v var="$1" '$5 == var' cat logfile | awk -v var="$1" '$5 == var'

Я хочу сделать входной файл, файл журнала, переменную, чтобы я мог использовать $ 1 в скрипте, а затем вызывать script logfile . Но тогда я должен объединить два сценария в один скрипт, потому что оба сценария анализируют один и тот же файл журнала. Каков, вообще говоря, правильный подход к этому? Я говорю вообще, потому что я новичок в bash-скриптах.

Две проблемы, с которыми я сталкиваюсь, во-первых: $ 1 первого скрипта (который является файлом журнала) отличается от $ 1 во втором скрипте (число, которое является результатом первого скрипта), которое я подключаю к awk. Во-вторых, я не могу найти эквивалент xargs -n1 для использования в одном скрипте bash.

One Solution collect form web for “Трубопровод нескольких строк в сценарии bash”

Второй awk считывает два входа один за другим – из выходного файла первого awk а затем из самого файла. Один из способов идентифицировать начало второго ввода – это то, что NR (общий объем текущего входа R ecord, в целом) больше не соответствует FNR (текущий номер записи File). Обратите внимание, что как средство FILE arg указывает awk на получение данных из stdin (в этом случае через канал ).

 awk '$6=="H"{print $5}' "$1" | awk 'NR==FNR{k[$1];next} $5 in k{print}' - "$1" 

Обратите внимание, что описанный выше метод идентификации второго входа является общим для использования, но не может вести себя так, как ожидалось / желателен, когда нет ничего, чтобы читать с первого входа. Для требований этой работы не будет никакого значения, если первый imput ничего не дает. Логика никогда не пройдет мимо NR=FNR где она создаст список значений индекса k (т. Е. $1 из основного файла) – но с ними ничего не делается – поэтому скрипт работает с нулевым вводом через канал, но только из-за беспорядочного побочного эффекта конкретной используемой логики.

Однако в GNU awk ( gawk ) есть надежный способ идентифицировать текущий файл / трубу. Существует специальный вариант аргументов FILE для командной строки: «… аргумент, который имеет форму var = value, присваивает значение переменной var-it вообще не указывает файл». – см .: Другие аргументы командной строки . Размещение таких аргументов var = value значимо. Значения, необходимые для конкретного FILE, должны быть помещены в командную строку до того, как связанное с ним FILE – следующее значение var = не будет применено в awk до тех пор, пока предыдущие файлы / труба была полностью прочитана.

Вот версия var = value .

 gawk '$6=="H"{print $5}' "$1" | gawk 'fn==1{k[$1];next} $5 in k{print}' fn=1 - fn=2 "$1" 

вывода (это то же самое для обеих версий скриптов)

 abcd 31 1 abcd 31 H abcd 31 2 abcd 33 1 abcd 33 H abcd 33 2 
  • xargs: запуск команды один раз со всеми аргументами
  • Странная ошибка «Нет такого файла» с «xargs» и «file»
  • Почему «xargs bash -ic echo» не то же самое, что «xargs echo» или «xargs»?
  • ssh-add добавить все закрытые ключи в .ssh каталог
  • Как найти и скопировать файлы на основе расширения?
  • Использование xargs для генерации ссылок
  • Копирование папки с помощью xargs
  • Исправлен последний аргумент с xargs
  • Как вы можете перемещать или копировать определенные файлы из списка текстовых файлов
  • Как проверить версию xargs?
  • Почему xargs -n 1 настолько медленный для длинных строк
  • Interesting Posts

    Объединение опций в команду find

    Вставка файла в другой файл с помощью sed

    Как найти время изменения / доступа / изменения файла или каталога?

    Какой лучший дистрибутив для Toshiba Satellite L10-205 (старое оборудование) используется в основном для разработки?

    Проблема Tmux Terminfo с привязкой клавиш Zsh

    Коммуникация с удаленным Serial через TCP / IP как устройство / dev / ttyX

    «Трудносвязанные» части большого файла, в котором только небольшая часть изменилась

    Btrfs RAID1: Как заменить жесткий диск, который физически больше не существует?

    Обновление php на сервере Linux

    Есть ли способ запустить VNC-сервер для уже запущенного X-сеанса?

    Как установить чувствительность мыши, а не только ускорение мыши?

    Как установить пакет vsftpd

    Nmcli отличается от Linux Mint 17, чем Ubuntu 16.04

    Файловая система для высокоактивной среды

    Установленная доля NFS. Может создавать папки в браузере файлов, но mkdir не работает через терминал

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