Tenho o seguinte arquivo com tabulações como separadores de campo:
header1 header2 header3 header4 header5
1field1 1field2 1field3 1field4 1field5
2field1 2field2 2field3 2field4 2field5
3field1 3field2 3field3 3field4 3field5
4field1 4field2 4field3 4field4 4field5
e gostaria de gerar cada linha em um novo arquivo (pulando a primeira linha). Cada novo arquivo será nomeado a partir do 1º e 5º campos com um separador de sublinhado. O arquivo da linha 1 (2 tecnicamente) seria nomeado "1field1_1field5.txt" e conteria todos os campos dessa linha e assim por diante. Eu tenho o seguinte comando awk que gera os nomes de arquivo corretos para a saída padrão
awk -v FS='\t' -v OFS='_' 'NR>1 {print ($1,$5 ".txt") }'
mas quando tento gerar o texto em nomes de arquivo
awk -v FS='\t' -v OFS='_' 'NR>1 {print > ($1,$5 ".txt") }'
Recebo o seguinte erro
awk: cmd. line:1: NR>1 { print > ($1,$5 ".txt") }
awk: cmd. line:1: ^ syntax error
Copiei e colei de 10 outros artigos diferentes para chegar até aqui, mas não consigo entender como minha formatação está errada.
A expressão
($1,$5 ".txt")
não é válida.Você pode estar pensando que o operador vírgula concatena seus argumentos usando
OFS
como separador. Mas não é assim queOFS
funciona. Ele é usado como separador quando você dá múltiplos argumentos aoprint
comando, mas não é usado em expressões.Em expressões, o único operador de concatenação é colocar subexpressões uma ao lado da outra. Se você quiser concatenar com,
OFS
você deve escrever explicitamente.Você também pode simplesmente escrever o literal em vez de usar
OFS
.Usando qualquer awk, você deve fazer o seguinte se seus campos $1 e $5 forem exclusivos por linha:
e isto de outra forma:
O
close()
é para que você não acabe com um erro de "muitos arquivos abertos" se sua entrada for grande. Oprintf "" > out
é para esvaziar/iniciar o arquivo de saída caso ele já existisse antes de seu script ser executado.Com o GNU awk você pode se safar sem
close()
:mas o script ficará significativamente mais lento para entradas grandes, pois ele tenta lidar internamente com a abertura/fechamento de todos os arquivos de saída conforme necessário.
Nesse caso
você está chamando
print
uma função com 2 argumentos$1
e concatenação de$5
e.txt
. Enquanto emnão há função para a qual inserir argumentos. Você pode usar
sprintf
a função string que formata e retorna a string da seguinte maneira