Tenho certeza de que há muitas maneiras de fazer isso: como posso contar o número de linhas em um arquivo de texto?
$ <cmd> file.txt
1020 lines
command-line
Chris Smith
fonte
fonte
cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l
./regexp/d
exclui uma linha se corresponderregexp
e-e
ativa uma sintaxe adequada (IMNSHO) pararegexp
.grep -v '^+ *%' matlab.git.diff | wc -l
?grep
comando para considerar casos de comentários como" + Hello"
(observe o (s) espaço (s) antes do+
)?grep -v '^ *+' matlab.git.diff | wc -l
(eu suponho que os sinais de cotação não foram feitos para fazer parte da linha; eu também assumo que ambas as linhas com e sem espaços à frente do+
texto sejam comentários; se em menos, um espaço é obrigatório, substituir a estrela*
com\+
, ou apenas adicionar um outro espaço na frente da estrela). Provavelmente, em vez de corresponder apenas a espaços, convém corresponder a espaços em branco arbitrários; para isso substitua o espaço com[[:space:]]
. Observe que também removi a correspondência de,%
pois não está no seu exemplo.Como Michael disse,
wc -l
é o caminho a percorrer. Mas, apenas no caso de você inexplicavelmente têmbash
,perl
ouawk
, mas nãowc
, aqui estão mais algumas soluções:Apenas Bash
Soluções Perl
e o muito menos legível:
Solução Awk
fonte
Steven D esqueceu o GNU
sed
:Além disso, se você quiser a contagem sem gerar o nome do arquivo e estiver usando
wc
:Apenas para o inferno:
fonte
grep -c ''
, outr -dc '\n' | wc -c
, ounl -ba -nln | tail -n 1 |sed -e 's/[^0-9].*//'
... Alguma dessas opções é útil por si só (em oposição às coisas a serem construídas para criar um programa que faz mais do que contar linhas), além dewc -l
(puro) (ba) sh?sed 's/.*//' file.txt | uniq -c
uniq -c -w 0 file.txt
e você podecut -c -7
manter apenas o número. Ou, mais POSIXly:uniq -c file.txt | awk '{c+=$1}END{print c}'
. Que taldc
(mesmo que não seja POSIX)?uniq -c file.txt | cut -c -7 | sed '$alax' | dc -e '[pq]sb[+z1=blax]sa' -
.bc
é POSIX:uniq -c file.txt | cut -c -7 | sed -n ':a;${s/\n/ + /gp;b};N;ba' | bc
. A resposta fácil se você assumir um comprimento de linha limitada:uniq -c -f 100000 file.txt
.Palavra de aviso ao usar
porque wc -l funciona contando \ n, se a última linha do seu arquivo não terminar em uma nova linha efetivamente, a contagem da linha será desativada em 1. (daí a convenção antiga que deixa a nova linha no final do seu arquivo)
Como nunca posso ter certeza se algum arquivo segue a convenção de terminar a última linha com uma nova linha ou não, recomendo usar qualquer um desses comandos alternativos que incluirão a última linha na contagem, independentemente da nova linha ou não.
fonte
Caso você tenha apenas o bash e absolutamente nenhuma ferramenta externa disponível, você também pode fazer o seguinte:
Explicação: o loop lê a entrada padrão linha por linha (
read
; como não fazemos nada com a entrada de leitura de qualquer maneira, nenhuma variável é fornecida para armazená-la) e aumenta a variável acount
cada vez. Devido ao redirecionamento (<file.txt
depoisdone
), a entrada padrão para o loop é defile.txt
.fonte
Você sempre pode usar o comando da
grep
seguinte maneira:Ele contará todas as linhas reais de
file.txt
, independentemente de sua última linha conter ou não um caractere LF no final.fonte