Создайте несколько именованных каналов (fifo) в зависимости от содержимого входного файла

Этот скрипт awk разбивает один файл журнала на несколько файлов меньшего размера:

#!/bin/awk -f
/topic = / { topic = $NF }    
/ : / { print $3 >> topic "___" $1 }   # $1 is the field name

Пример входного файла:

topic = foo
A   : 23
BB  : Text1
Zz  : 77

topic = bar
A   : 88
B   : 66

topic = foo
A   : 25
B   : 12
BB  : Text2

Пример сгенерированных выходных имен файлов:

foo___A
foo___B
foo___BB
foo___Zz
bar___A
bar___B

Но теперь я хочу создать выходной fifo вместо обычного файла.

Fifo (именованный канал) должен использовать то же имя файла, что и текущий обычный файл. Например, можно написать сценарий оболочки с помощью инструмента mkfifo следующим образом:

mkfifo foo___A
mkfifo foo___B
mkfifo foo___BB
mkfifo foo___Zz
mkfifo bar___A
mkfifo bar___B    

здравый смысл:

  • скрипт не должен знать обо всех возможных темах и полях
  • скрипт не требует создания несколько раз одного и того же фифа

Если awk не подходит для этой цели, я открыт для любого другого языка, как bash, zsh, perl, python и т. Д....

Какой язык программирования вы бы выбрали для реализации этого скрипта? оболочка / AWK / Perl / Python / рубин...
Что вы предлагаете в качестве реализации?


РЕДАКТИРОВАТЬ: Кевин ответ правильный. Существует также другая альтернатива его сценария:

#!/usr/bin/awk -f

/topic = / { topic = $NF }    
/ : / { 
    file = topic "___" $1
    system("test ! -e "file" && mkfifo "file)
    print $3 > file
}

Вы все еще можете предложить свою идею на основе awk или любой другой язык программирования;)

Чтобы проверить ваш скрипт, вы можете запустить следующую команду оболочки в другом терминале:

while true; do find -name '*___*' -ls -exec head '{}' '+'& sleep 1; done

1 ответ

Решение
#!/usr/local/bin/awk -f 

/topic = / { topic = $NF }    
/ : / { 
    file = topic "___" $1
    system("mkfifo "file)
    print $3 > file
    close(file)
    system("rm "file)
}   

Имейте в виду, что print будет блокироваться до тех пор, пока вы не прочитаете из fifo, поэтому вам нужно либо выполнить команду awk в фоновом режиме, либо прочитать ее с другого терминала

Другие вопросы по тегам