wc -l file.txt
gera o número de linhas e o nome do arquivo.
Eu preciso apenas do número em si (não do nome do arquivo).
eu posso fazer isso
wc -l file.txt | awk '{print $1}'
Mas talvez haja uma maneira melhor?
wc -l file.txt
gera o número de linhas e o nome do arquivo.
Eu preciso apenas do número em si (não do nome do arquivo).
eu posso fazer isso
wc -l file.txt | awk '{print $1}'
Mas talvez haja uma maneira melhor?
Respostas:
Tente desta maneira:
wc -l < file.txt
wc -l
não deve emitir um e por que o ksh precederá a saída padrão de um programa com um espaço?
4711 [stdin]
a saída.
printf "%'d"
, que cuida do espaço e imprime grandes números de maneira agradável.
cat file.txt | wc -l
De acordo com a página do manual (para a versão BSD, não tenho uma versão GNU para verificar):
Se nenhum arquivo for especificado, a entrada padrão será usada e nenhum nome de arquivo será exibido. O prompt aceitará entrada até receber EOF ou [^ D] na maioria dos ambientes.
wc -l < file.txt
tem o mesmo efeito.
wc -l < file.txt
para evitar o uso inútil de gato. Embora você seja absolutamente louco, se acha que está consumindo um tempo perceptível.
Para fazer isso sem o espaço à esquerda, por que não:
wc -l < file.txt | bc
wc -l < file.txt
para corrigir o erro de análise e remover o espaço:wc -l < file.txt | bc
E se
wc -l file.txt | cut -d' ' -f1
ou seja, canalize a saída para wc
into cut
(onde delimitadores são espaços e escolha apenas o primeiro campo)
wc -l file.txt | awk '{print $1}'
OP tentou.
wc -l < file.txt
método. Mas deve usar | cut -d' ' -f2
no BSD, desde que o wc
comando retorne um espaço à esquerda, exemplo: "34068289 file.txt", em vez de "34068289 file.txt".
Tive um problema semelhante ao tentar obter uma contagem de caracteres sem o espaço em branco fornecido pelo wc
, o que me levou a esta página. Depois de tentar as respostas aqui, a seguir estão os resultados dos meus testes pessoais no Mac (BSD Bash). Novamente, isso é para contagem de caracteres; pela contagem de linhas que você faria wc -l
. echo -n
omite a quebra de linha à direita.
FOO="bar"
echo -n "$FOO" | wc -c # " 3" (x)
echo -n "$FOO" | wc -c | bc # "3" (√)
echo -n "$FOO" | wc -c | tr -d ' ' # "3" (√)
echo -n "$FOO" | wc -c | awk '{print $1}' # "3" (√)
echo -n "$FOO" | wc -c | cut -d ' ' -f1 # "" for -f < 8 (x)
echo -n "$FOO" | wc -c | cut -d ' ' -f8 # "3" (√)
echo -n "$FOO" | wc -c | perl -pe 's/^\s+//' # "3" (√)
echo -n "$FOO" | wc -c | grep -ch '^' # "1" (x)
echo $( printf '%s' "$FOO" | wc -c ) # "3" (√)
Eu não confiaria no cut -f*
método em geral, pois exige que você saiba o número exato de espaços à esquerda que qualquer saída pode ter. E o grep
que funciona para contar linhas, mas não caracteres.
bc
é o mais conciso awk
e perl
parece um pouco exagerado, mas todos devem ser relativamente rápidos e portáteis o suficiente.
Observe também que alguns deles podem ser adaptados para aparar o espaço em branco circundante a partir de seqüências de caracteres gerais (além de echo `echo $FOO`
outro truque).
echo $(printf '%s' "$FOO" | wc -c)
é uma das raras ocasiões em que echo
com uma sub - substituição de comando não é inútil.
echo `echo $FOO`;
também age como um comando String.trim () em uma variável! Isso é incrivelmente útil. Também adicionarei sua linha à minha resposta.
printf
melhor que echo
?
E se
grep -ch "^" file.txt
grep
mas verificá-lo (sem surpresa) é 2x a 6x mais lento que o wc
método mais simples / direto nos meus testes.
Obviamente, existem muitas soluções para isso. Aqui está outro:
wc -l somefile | tr -d "[:alpha:][:blank:][:punct:]"
Isso gera apenas o número de linhas, mas o caractere de nova linha à direita ( \n
) está presente; se você não quiser, substitua [:blank:]
por [:space:]
.
test9
com 1 linha, a saída será 19.
A melhor maneira seria encontrar todos os arquivos no diretório e depois usar o AWK NR (número de variáveis variáveis)
abaixo está o comando:
find <directory path> -type f | awk 'END{print NR}'
exemplo: - find /tmp/ -type f | awk 'END{print NR}'
wc -l < file.txt
faz o trabalho de forma precisa e concisa.