Por que o awk não mostra a duração correta do registro?

0

Estou preocupado com o que awk mostra como a duração do registro. Eu estou verificando alguns arquivos para um comprimento de registro específico - awk mostra o resultado que eu queria, mas o tamanho do arquivo mostra que cada registro no arquivo é realmente maior do que o que awk diz por 1 byte.

$ ls -l some_file.txt
-rw-r--r--    1 foo   bar           250614 Oct 20 08:49 some_file.txt

$ awk '{ print length }' some_file.txt | sort -u
458

$ echo "(250614%458)" | bc
88

$ echo "(250614%459)" | bc
0

Observe que o resultado bc está errado com um comprimento de registro de 458 , mas parece bom com um comprimento de registro de 459 . Além disso, awk + sort mostra que os registros all têm um comprimento de registro de 458 . Meu palpite é que awk não está representando o caractere End Of Line , fazendo com que a duração real do registro seja 459 . O que você acha?

ps: awk em AIX 5.3

    
por jimm-cl 20.10.2014 / 16:20

2 respostas

2

Isso ocorre porque o separador de registro padrão RS está definido como nova linha.

Portanto awk interpretará isso como um separador em vez de um caractere no tamanho.

Para verificar o que RS está definido como:

echo | awk '{print "\""RS"\""}'
"
"

As aspas são separadas por uma nova linha mostrando o valor RS .

Para confirmar que o caractere RS não está incluído na saída de comprimento:

$ echo test > some_file.txt
$ ls -l
-rw-r--r--. 1 user user    5 Oct 20 16:33 some_file.txt

Mostre o comprimento com RS definido para nova linha.

$ awk '{print length}' some_file.txt
4

Defina RS como um caractere que não existe no arquivo e conte novamente:

$ awk 'BEGIN {RS=":"} {print length}' some_file.txt
5

O caractere adicional está agora incluído.

    
por 20.10.2014 / 17:42
2

O que você está vendo é perfeitamente normal. Por padrão, o awk não inclui o caractere de nova linha em um registro.

Do padrão POSIX para o awk :

Input shall be interpreted as a sequence of records. By default, a record is a line, less its terminating <newline>
...
String Functions
   length[([s])] - Return the length, in characters, of its argument taken as a string, or of the whole record, $0, if there is no argument.

    
por 20.10.2014 / 17:32

Tags