Contando o número de linhas no arquivo independentemente da linha que termina char

2

Suponha que eu receba vários arquivos, alguns com finais de linha de \r , \n e \r\n . Como eu poderia contar com eficiência o número de linhas em um arquivo quando não sei o que esperar de antemão?

Obviamente, wc -l não funcionará se houver finais de linha do Mac.

O grep parece ser muito impreciso quando usado:

grep -o '\r' /path/to/file.txt | wc -l

Dá 1041 linhas, mas na verdade existem apenas 299 linhas e nano é capaz de confirmar isso convertendo automaticamente a partir do formato Mac.

Ele também não oferece a versatilidade que eu esperava porque grep -o '[\r\n]+' /path/to/file.txt | wc -l retorna uma contagem de 0.

Como faço isso corretamente?

    
por eComEvo 29.12.2016 / 07:01

2 respostas

0

Seu comando grep estava dando muitas correspondências porque grep usa Expressões regulares básicas , que não dão significado especial a \r - estava contando as ocorrências da letra "r".

tr faz reconhecer \n e \r , para que possa encontrar todas as correspondências e deixar wc -c contá-las byte por byte:

tr -d -c '\n\r' < file.txt | wc -c

Mas, como o arquivo também pode conter finais de linha do Windows / DOS ( \r\n ), eles seriam contados duas vezes. Você precisará de uma etapa adicional para converter quaisquer fins de linha no estilo DOS em um dos outros formulários e, em seguida, contar caracteres individuais de fim de linha como antes:

sed 's/\r$//' file.txt | tr -d -c '\n\r' | wc -c

Infelizmente, sed nem sempre reconhece \r . Talvez seja necessário usar outra maneira de especificar um retorno de carro, como o próprio escape do shell, o comando echo ou colocar o script sed em um arquivo.

    
por 30.12.2016 / 17:46
0
gawk 'END {print NR}' RS='\r|\n|\r\n' file.txt

A variável RS especifica o que é considerado uma nova linha para gawk , neste caso, uma expressão regular.

    
por 29.12.2016 / 08:14

Tags