Como você lista o número de linhas de cada arquivo em um diretório em formato legível por humanos.

26

Eu tenho uma lista de diretórios e subdiretórios que contêm arquivos csv grandes. Existem cerca de 500 milhões de linhas nesses arquivos, cada um é um registro. Eu gostaria de saber

  1. Quantas linhas estão em cada arquivo.
  2. Quantas linhas estão no diretório.
  3. Quantas linhas no total

Mais importante, eu preciso disso em 'formato legível por humanos', por exemplo. 12,345,678 em vez de 12345678

Seria bom aprender como fazer isso de três maneiras. Ferramentas básicas de baunilha, awk etc. e perl (ou python).

    
por Hexatonic 07.02.2016 / 20:16

4 respostas

40

How many lines are in each file.

Use wc , originalmente para contagem de palavras, acredito, mas ele pode fazer linhas, palavras, caracteres, bytes e o comprimento de linha mais longo. A opção -l diz para contar linhas.

wc -l <filename>

Isso produzirá o número de linhas em:

$ wc -l /dir/file.txt
32724 /dir/file.txt

Você também pode enviar dados para wc :

$ cat /dir/file.txt | wc -l
32724
$ curl google.com --silent | wc -l
63

How many lines are in directory.

Tente:

find . -name '*.pl' | xargs wc -l

outro one-liner:

( find ./ -name '*.pl' -print0 | xargs -0 cat ) | wc -l

BTW, o comando wc conta novos códigos de linhas, não linhas. Quando a última linha no arquivo não terminar com o novo código de linha, isso não será contado.

Você pode usar grep -c ^, exemplo completo:

#this example prints line count for all found files
total=0
find /path -type f -name "*.php" | while read FILE; do
     #you see use grep instead wc ! for properly counting
     count=$(grep -c ^ < "$FILE")
     echo "$FILE has $count lines"
     let total=total+count #in bash, you can convert this for another shell
done
echo TOTAL LINES COUNTED:  $total

How many lines in total

Não tenho certeza se entendi corretamente. por exemplo. Isto irá mostrar os resultados no seguinte formato, mostrando o número de linhas para cada arquivo:

# wc -l 'find /path/to/directory/ -type f'
 103 /dir/a.php
 378 /dir/b/c.xml
 132 /dir/d/e.xml
 613 total

Como alternativa, para gerar apenas o número total de caracteres de nova linha sem o arquivo por contagem de arquivos, o seguinte comando pode ser útil:

# find /path/to/directory/ -type f -exec wc -l {} \; | awk '{total += $1} END{print total}'
 613

Most importantly, I need this in 'human readable format' eg. 12,345,678 rather than 12345678

O Bash tem uma função printf embutida:

printf "%0.2f\n" $T

Como sempre, existem muitos métodos diferentes que podem ser usados para alcançar os mesmos resultados mencionados aqui.

    
por 07.02.2016 / 20:49
6

Em muitos casos, combinar o comando wc e o caractere curinga * pode ser suficiente.
Se todos os seus arquivos estiverem em um único diretório, você poderá ligar:

wc -l src/*

Você também pode listar vários arquivos e diretórios:

wc -l file.txt readme src/* include/*

Este comando mostrará uma lista dos arquivos e seu número de linhas. A última linha será a soma das linhas de todos os arquivos.

Para contar todos os arquivos em um diretório recursivamente:

Primeiro, ative o globstar adicionando shopt -s globstar ao seu .bash_profile. O suporte para globstar requer Bash ≥ 4.x, que pode ser instalado com brew install bash , se necessário. Você pode verificar sua versão com bash --version .

Em seguida, execute:

wc -l **/*

Observe que esta saída estará incorreta se globstar não estiver ativado.

    
por 30.01.2017 / 20:22
1

um pouco atrasado para o jogo, mas eu tenho um monte de erros de argumento com o anterior devido ao tamanho do dir. Isso funcionou para mim:

for i in $(find . -type f); do wc -l $i; done >> /home/counts.txt

    
por 17.08.2018 / 01:50
0

Este comando fornecerá uma lista de linhas de código em cada diretório:

find . -name '*.*' -type f | xargs wc -l
    
por 08.03.2018 / 15:24