Falha no comando Awk durante o redirecionamento com valor sting nulo

0

Eu quero dividir o arquivo grande em pedaços. O nome do arquivo e os registros numéricos por arquivo após a divisão serão fornecidos como argumentos / variáveis para o awk.

EG: FILENAME=A_20 (digamos que tenha 100 registros), NoOfRecordsPerFile=50 Os nomes dos arquivos divididos devem ser

A_20-1.txt
A_20-2.txt

O comando que estou usando é:

awk -vNoOfRecordsPerFile -vFILENAME 'NR%NoOfRecordsPerFile==1{x=FILENAME"-"++i".txt"}{print > x}' $FILENAME

Estou com erro:

awk: (FILENAME=A_20 FNR=1) fatal expression for '>' has null string value

Estou fazendo algo errado?

O mesmo comando está funcionando para o outro arquivo.

    
por Sreekesh Darshi 20.07.2018 / 09:15

2 respostas

2

Você está usando a variável FILENAME com um valor vazio (você nunca atribui FILENAME a um valor na linha de comando), isso deve gerar um erro antes mesmo do script awk começa a correr. awk tem uma variável chamada FILENAME que você pode usar. É o nome do arquivo de entrada atual.

Usando -vNoOfRecordsPerFile , você diz que deseja atribuir um valor a uma variável awk na linha de comando, mas nunca atribui um valor. Isso deve produzir um erro diferente daquele que você diz que está recebendo. Se você quisesse usar o valor da variável shell com o mesmo nome, use -v NoOfRecordsPerFile="$NoOfRecordsPerFile" .

Assim, o comando final awk torna-se:

awk -v NoOfRecordsPerFile="$NoOfRecordsPerFile" '
    ((NR-1) % NoOfRecordsPerFile) == 0 { x = FILENAME "-" ++i ".txt" }
                                       { print > x                   }' "$FILENAME"
    
por 20.07.2018 / 10:08
0

Seu erro vem da condição NR%NoOfRecordsPerFile==1 que não é atendida antes de usar a variável x , para que a variável não seja definida.

Em vez de awk , você pode usar split :

split -l 50 -d --additional-suffix='.txt' --numeric-suffixes=1 A_20 'A_20-'

Isso divide o arquivo A_20 em dois arquivos de 50 linhas chamados A_20-01.txt e A_20-02.txt .

Se você quiser usar awk , pode tentar isto:

awk -v lineno=50 '((NR-1)%lineno)==0{cnt++;f=FILENAME "-" cnt ".txt"}{print >>f}' A_20
    
por 20.07.2018 / 09:38

Tags