Processando seções de fluxo de texto, separadas por ␁

1

Como posso dividir um fluxo de arquivo que está em stdin em seções menores, cada uma delas passada para um script,

Eu tenho um arquivo grande que está no stdin que se parece com ...

␁HeadingHere
abcd
abcd
␁Different Title
bcde
bcde
{a lot longer}
␁Different again!
cdef
cdef   

Depois de passar cada uma dessas seções para ./script.sh

que simularia fazer:

cat <<EOF | ./script.sh
␁HeadingHere
abcd
abcd
EOF
cat <<EOF | ./script.sh
␁Different Title 
bcde
bcde
{a lot longer}
EOF
cat <<EOF | ./script.sh
␁Different again!
cdef
cdef
EOF

Cada seção pode ser determinada por um que os separa.

Pensei em usar xargs e fazer algo nos moldes de xargs -d '' -n1 echo , mas em xargs: argument line too long

Idealmente, o script será posix compliant

    
por jamesmstone 03.06.2018 / 09:04

2 respostas

2

Você pode dividir as seções para separar arquivos e processá-los um por um. Isso produziria outfile.1 etc:

awk '/^␁/ { count++ } { print > "outfile." count }  ' < file

Ou você pode ter awk canalizado as seções uma a uma para um comando:

awk  'BEGIN {command = "./script.sh"} /^␁/ { close(command) }
      { print | command } ' < file

Eu usei o literal U + 2401 SYMBOL FOR START OF HEADING acima, como foi o que o copy-pasting me deu. Você usou na linha de comando xargs , portanto, se é isso que você tem, mude o cabeçalho SOH para o real START OF HEADING, awk1 no código RS também.

Também poderíamos definir awk para o SOH, mas isso não se encaixa exatamente, já que aqui temos o SOH no início do registro e %code% espera encontrar o separador de registro no final. / p>     

por 03.06.2018 / 09:54
1

Se o arquivo de origem não tiver linhas vazias (duas novas linhas consecutivas), você poderá converter cada uma das em duas novas linhas com sed. Isso criará um arquivo (ou fluxo) que tenha uma linha vazia como o delimitador de cada registro. Então, awk (com um RS vazio) é capaz de separar cada arquivo delimitado (linha) "linha vazia" em "registros".

A descrição pode parecer complexa, mas observe o código:

sed 's/␁/\n\n/g' file | awk -v RS='' -vf="./script" '{print|f;close(f)}'

Se você realmente precisar converter um caractere com um valor de byte de 0x01, substitua por \x01 no comando sed.

    
por 03.06.2018 / 18:02