Создайте несколько именованных каналов (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    

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

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

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

Какой язык программирования вы бы выбрали для реализации этого скрипта? shell/awk/perl/python/ruby...
Что вы предлагаете в качестве реализации?


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

#!/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

person oHo    schedule 23.10.2013    source источник


Ответы (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 в фоновом режиме, либо прочитать их с другого терминала.

person Kevin    schedule 23.10.2013
comment
Привет, Кевин. Вы правы, print заблокирован до чтения канала :( Любая подсказка по использованию неблокирующих именованных каналов? Ура! Увидимся;) - person oHo; 24.10.2013
comment
Я только что нашел этот интересный ответ от Чарльз Даффи... попробую позже... Ура - person oHo; 24.10.2013