Esta é uma pergunta que pesquisei duas vezes agora. Esse comportamento do wc não é intuitivo e antiparadigmático para a tênue complexidade usual. Essa dispersão existe por um motivo, porque você exatamente não deseja solucionar todos os tipos de redundância fofa. Afinal, eu sei o nome do arquivo, não é? O que eu quero é a contagem de linhas.
No AIX, ksh, isso sempre terá um espaço antes do número. Nós temos que usar | awk '{print $ 1}' ou um corte, para aparar os espaços. Outra maneira de aparar seria anexar um eco.
rao 18/02
@rao está correto, isso adicionará um espaço antes do número. Minha solução resolve isso e é mais simples do que awk ou cut.
Desi Cochrane
@rao Não há espaço com o bash. De onde vem o espaço em ksh? wc -lnão deve emitir um e por que o ksh precederá a saída padrão de um programa com um espaço?
Peter - Restabelece Monica
Embora esta seja a solução correta (e seja fácil o suficiente que nunca tenhamos sido alterados), provavelmente é mais lenta e pouco intuitiva. Por um lado, eu esperaria algo como 4711 [stdin]a saída.
Peter - Restabelece Monica
Considere também emparelhar com printf "%'d", que cuida do espaço e imprime grandes números de maneira agradável.
Leo
21
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.
Eu não gosto de gatos - a concatenação consome muito tempo.
precisa saber é o seguinte
9
wc -l < file.txttem o mesmo efeito.
Pjmorse
@ usuário: Teste. De longe, a parte mais lenta será ler o arquivo do disco.
sarnold
11
@ user1286528 use wc -l < file.txtpara evitar o uso inútil de gato. Embora você seja absolutamente louco, se acha que está consumindo um tempo perceptível.
precisa
12
Para fazer isso sem o espaço à esquerda, por que não:
Eu recebo erros de sintaxe com isso (Ubuntu 14.04). Eu acho que há um problema com o nome do arquivo.
MERose 07/07
Em um RHEL 6.7, gera erros: $ wc -l file.csv | bc (standard_in) 1: erro de sintaxe (standard_in) 1: carácter ilegal: N (standard_in) 1: erro de sintaxe (standard_in) 1: erro de sintaxe
Rodrigo Hjort
3
Eu também obter um erro de análise, mas você pode combinar isso com a outra resposta de usar wc -l < file.txtpara corrigir o erro de análise e remover o espaço:wc -l < file.txt | bc
jangosteve
11
E se
wc -l file.txt | cut -d' '-f1
ou seja, canalize a saída para wcinto cut(onde delimitadores são espaços e escolha apenas o primeiro campo)
isso não é melhor do que o wc -l file.txt | awk '{print $1}'OP tentou.
doubleDown 6/08/13
1
Mais rápido que o wc -l < file.txtmétodo. Mas deve usar | cut -d' ' -f2no BSD, desde que o wccomando retorne um espaço à esquerda, exemplo: "34068289 file.txt", em vez de "34068289 file.txt".
Sopalajo de Arrierez
@doubleDown bem, usar o awk é como usar uma máquina CNC para cortar uma placa em vez de uma serra. Use uma serra para serrar.
Peter - Restabelece Monica
5
Comparação de Técnicas
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 -nomite a quebra de linha à direita.
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 grepque funciona para contar linhas, mas não caracteres.
bcé o mais conciso awke perlparece 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).
@tripleee Whoa ... com base no seu código, 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.
Agradável. Uso muito original / criativo, grepmas verificá-lo (sem surpresa) é 2x a 6x mais lento que o wcmétodo mais simples / direto nos meus testes.
Arielf 21/04/19
3
Obviamente, existem muitas soluções para isso. Aqui está outro:
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:].
wc -l < file.txt
faz o trabalho de forma precisa e concisa.Respostas:
Tente desta maneira:
fonte
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.De acordo com a página do manual (para a versão BSD, não tenho uma versão GNU para verificar):
fonte
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:
fonte
wc -l < file.txt
para corrigir o erro de análise e remover o espaço:wc -l < file.txt | bc
E se
ou seja, canalize a saída para
wc
intocut
(onde delimitadores são espaços e escolha apenas o primeiro campo)fonte
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 owc
comando retorne um espaço à esquerda, exemplo: "34068289 file.txt", em vez de "34068289 file.txt".Comparação de Técnicas
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ê fariawc -l
.echo -n
omite a quebra de linha à direita.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 ogrep
que funciona para contar linhas, mas não caracteres.bc
é o mais concisoawk
eperl
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).fonte
echo $(printf '%s' "$FOO" | wc -c)
é uma das raras ocasiões em queecho
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 queecho
?E se
fonte
grep
mas verificá-lo (sem surpresa) é 2x a 6x mais lento que owc
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:]
.fonte
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:
exemplo: -
find /tmp/ -type f | awk 'END{print NR}'
fonte
Isso funciona para mim usando o normal
wc -l
esed
para remover qualquer caractere que não seja um número.fonte