Трубопровод нескольких строк в сценарии 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 
  • Используйте команду grep и найдите
  • Эффективная генерация stdin в сценарии оболочки
  • вывод технологического процесса на команду split by line и whitespace
  • find + xargs: строка аргумента слишком длинная
  • Почему xargs -I подразумевает -L 1
  • Правильный синтаксис для использования awk в сочетании с другой командой внутри xargs sh -c
  • xargs на OSX: незаконный вариант -
  • Утилита, полезная для работы с памятью, возвращает N первых отсортированных значений
  • Как рекурсивно бок о бок diff каталоги с номерами строк в diff в unix?
  • Каков наилучший способ избавиться от шаблона в нескольких файлах php?
  • Расширение оболочки оболочки Ubuntu - путаница с командой sox
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.