Como posso direcionar a saída do awk para vários arquivos individuais em um diretório especificado

0

Estou tendo problemas para direcionar a saída do awk para arquivos individuais em um diretório especificado. Eu posso fazer isso com sucesso no diretório de trabalho, bem como encadear um comando mv para o final, mas gostaria de poder usar apenas awk para salvar os arquivos no diretório especificado.

Para referência, aqui está um messages.txt simplificado que eu quero dividir em arquivos de mensagens individuais:

messageHeader:
  mh_field1: mh_val1
  mh_field2: mh_val2
messageData:
  md_field1: md_val1
  md_field2: md_val2

messageHeader:
  mh_field1: mh_val1
  mh_field2: mh_val2
messageData:
  md_field1: md_val1
  md_field2: md_val2

messageHeader:
  mh_field1: mh_val1
  mh_field2: mh_val2
messageData:
  md_field1: md_val1
  md_field2: md_val2

Consegui dividir com êxito o arquivo de mensagens em mensagens individuais e enviá-las para um arquivo separado no diretório de trabalho usando:

awk -v RS= '{print > ("message" NR ".txt")}'

Que cria message1.txt , message2.txt e message3.txt no diretório de trabalho. Eu também posso encadear um comando mv para o final deste comando básico como assim mover a saída para um diretório especificado:

out = "$(pwd)/messages"
mkdir -p $out
awk -v RS= '{print > ("message" NR ".txt")}' && mv message*.txt $out

Que cria message1.txt , message2.txt e message3.txt em ./messages . No entanto, não consegui descobrir como salvar os arquivos de mensagens separados em um diretório especificado usando apenas awk .

Por exemplo, tentei dividir o arquivo de mensagens e enviar mensagens individuais para um diretório de saída especificado da seguinte forma:

out="$(pwd)/messages"
mkdir -p $out
awk -v RS= '{print > ($out "message" NR ".txt")}' messages.txt

O que resulta no seguinte erro:

awk: cmd. line:1: (FILENAME=- FNR=1) fatal: can't redirect to 'messageHeader:
  mh_field1: mh_val1 
  mh_field2: mh_val2
messageData:
  md_field1: md_val1
  md_field2: md_val2message1.txt' (file name too long)

Encontrei a seguinte questão relacionada " Divida os arquivos usando o awk e gere os resultados em outro diretório ", mas ainda assim não foi possível obter a sintaxe correta.

out="$(pwd)/messages"
mkdir -p $out
awk -v RS= path=$out '{f=path "message" NR ".txt"; print > f}' messages.txt 

awk: fatal: cannot open file '{f=path "message" NR ".txt"; print > f}' for reading (No such file or directory)
    
por cneiderer 19.11.2018 / 04:08

1 resposta

0

Per @ comment do steeldriver, faltava um -v , fazendo a sintaxe correta:

out="$(pwd)/messages"
mkdir -p $out
awk -v RS= -v path="$out" '{f=path "message" NR ".txt"; print > f}' messages.txt
    
por 19.11.2018 / 13:28

Tags