Como a contagem de palavras funciona para newline (-l)? Número de novas linhas ou linhas

6

Gostaria de saber como o wc funciona? Na maioria das vezes parece retornar o número de linhas, mas às vezes parece ser novas linhas? Na página man suas novas linhas. Mas:

[jiewmeng@JM textFiles]$ echo -e "\n\n" | wc -
      3       0       3 -

Se o acima retornar o número de novas linhas, ele deve retornar 2? Também recebi este arquivo estranho:

[jiewmeng@JM textFiles]$ cat testA.txt 
The quick
brown fox
jumped over
the lazy 
dog.[jiewmeng@JM textFiles]$ wc testA.txt 
 4  9 50 testA.txt

No caso acima, parece estar retornando o número de novas linhas?

    
por Jiew Meng 25.02.2014 / 11:17

3 respostas

11

No seu primeiro exemplo, echo adicionará sua nova linha no final, você pode parar isso adicionando a opção -n para ecoar.

wc conta caracteres, palavras e linhas, linhas são definidas como zero ou mais caracteres que terminam em avanço de linha ( \n ).

    
por 25.02.2014 / 11:23
10

O motivo pelo qual você obtém 3 aqui já foi explicado, mas para adicionar um pouco mais sobre a questão no assunto:

Pela definição estrita (POSIX) do termo, uma linha de texto é sempre terminada por um caractere de nova linha, então contar o número de caracteres de nova linha é o mesmo que contar o número de linhas.

Às vezes, no entanto, você encontra arquivos que possuem dados após a última nova linha (normalmente, arquivos que não são de texto provavelmente o fazem). A saída de printf foo (o mesmo que echo -n foo ou echo 'foo\c' dependendo da implementação echo ) por exemplo, não contém nenhuma linha porque foo não é terminado por um caractere de nova linha.

O comportamento dos utilitários de texto ( wc não é um utilitário de texto) não é especificado por POSIX nesse caso (um arquivo que termina em um caractere diferente de nova linha não é um arquivo de texto). Existem algumas implementações de utilitário que tratam esses caracteres extras como uma linha extra, alguns que os ignoram, alguns podem emitir uma mensagem de aviso. Entre os que o tratam como uma linha extra, alguns adicionarão a nova linha que falta, alguns outros não.

O que isso significa é que wc -l não necessariamente lhe dará o mesmo resultado de coisas como sed -n '$=' ou awk 'END{print NR}' ou grep -c '^' .

    
por 25.02.2014 / 13:23
8

Sua suposição está correta. wc -l conta o número de novas linhas ( \n ). Como XTian disse, echo adiciona uma nova linha ao final de tudo que é impresso, a menos que você diga não com -n com algumas implementações ou incluindo \c em algumas outras (compatíveis com Unix).

Você pode verificar o que está acontecendo percorrendo od -c :

$ echo -e '\n\n' | od -c
0000000  \n  \n  \n
0000003

Portanto, wc -l conta corretamente três linhas.

    
por 25.02.2014 / 11:47

Tags