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
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)