Bir dizindeki her dosyanın satır sayısını, insan tarafından okunabilir biçimde nasıl listeliyorsunuz.


40

Büyük csv dosyaları içeren dizinlerin ve alt dizinlerin bir listesine sahibim. Bu dosyalarda yaklaşık 500 milyon satır var, her biri bir kayıt. bilmek isterim

  1. Her dosyada kaç satır var.
  2. Dizinde kaç satır var.
  3. Toplamda kaç satır var

En önemlisi, buna 'insan tarafından okunabilir biçimde' ihtiyacım var, örneğin. 12345678 yerine 12,345,678

Bunun 3 şekilde nasıl yapıldığını öğrenmek güzel olurdu. Sade vanilya bash aletleri, awk vs. ve perl (veya python).

Yanıtlar:


56

Her dosyada kaç satır var.

wcAslında, sözcük sayımı için kullanın , inanıyorum, ancak satır, sözcük, karakter, bayt ve en uzun satır uzunluğunu yapabilir. -lSeçenek satırları saymak söyler.

wc -l <filename>

Bu, aşağıdaki satır sayısını gösterecektir:

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

Verileri wcayrıca yönlendirebilirsiniz:

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

Dizinde kaç satır var.

Deneyin:

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

bir başka astar:

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

BTW, wckomut satırları değil yeni satır kodlarını sayar. Dosyadaki son satır yeni satır koduyla bitmediğinde, bu sayılmaz.

Grep -c ^ kullanabilirsiniz, tam örnek:

#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

Toplamda kaç satır var

Doğru istediğinizi anladığımdan emin değilim. örneğin bu, her dosya için satır sayısını gösteren aşağıdaki biçimde sonuçları verecektir:

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

Alternatif olarak, yalnızca toplam yeni satır karakteri sayısını dosya olmadan yazdırarak aşağıdaki komutu saymak yararlı olabilir:

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

En önemlisi, buna 'insan tarafından okunabilir biçimde' ihtiyacım var, örneğin. 12345678 yerine 12,345,678

Bash'in yerleşik bir printf işlevi var:

printf "%0.2f\n" $T

Her zaman olduğu gibi, burada belirtilen sonuçları elde etmek için kullanılabilecek birçok farklı yöntem vardır.


Bu arada, örneklerinde printf'i nasıl kullanırım? WC'den kullanmaya çalıştım ama işe yaramadı.
Hexatonic

deneyin> bul. -name '* .pl' | xargs wc -l | awk '{printf ("% 0.2f", $ 1)} {print $ 2}' ihtiyaçlarınız için 'printf' çıktısını değiştirin
malyy

Bu, sayıyı, insan tarafından okunabilir hale getirmek için virgül eklemiyor. Sadece sonuna bir sıfır ekler.
Hexatonic

yankı 1000000000000 | xargs printf "% 'd \ n" 1,000,000,000,000
Hexatonic

1
@Hexatonic printfonun argümanları okumuyor stdin, daha ziyade komut satırından (için boru karşılaştırmak echoiçin boru vs cat; catdan okur stdin, echodeğil). Bunun yerine printf "$(find ... | xargs ...)"çıktıyı argüman olarak sağlamak için kullanın printf.
BallpointBen

13

Çoğu durumda wckomut ve joker karakterin birleştirilmesi *yeterli olabilir.
Tüm dosyalarınız tek bir dizindeyse, aşağıdakileri arayabilirsiniz:

wc -l src/*

Ayrıca birkaç dosya ve dizini de listeleyebilirsiniz:

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

Bu komut dosyaların bir listesini ve satır sayısını gösterir.
Son satır, tüm dosyalardan satırların toplamı olacaktır.


Bir dizindeki tüm dosyaları tekrar tekrar saymak için:

İlk shopt -s globstarönce, .bash_profile dosyasına ekleyerek globstar'ı etkinleştirin . Globstar desteği, gerekirse kurulabilecek Bash ≥ 4.x brew install bashgerektirir. İle sürümünüzü kontrol edebilirsiniz bash --version.

O zaman koş:

wc -l **/*

Globstar etkin değilse bu çıkışın yanlış olacağını unutmayın.


Geçerli dizindeki dosyaları yinelemeli olarak saymak için:wc -l **/*
Taylor Edmiston

@TaylorEdmiston Benim için (Mac'te) yalnızca dosyaları tam olarak bir dizin aşağı sayar. Geçerli dizindeki dosyaları atlar ve birden fazla dizin derinlemesine sahip olabilecek herhangi bir örnek için, bir dizin olduğu konusunda uyarır: " wc: parent_dir/child_dir: read: Is a directory"
M. Justin

@Thomio Globstar'ın etkinleştirilmesi gerekir. MacOS'ta, kutunun dışında bırakıldığına inanıyorum. Cevabınıza, komutu ekleyen ve globstar'ın nasıl etkinleştirileceğini içeren bir düzenleme gönderdim.
Taylor Edmiston

2

Bu komut, her dizindeki satır kodlarının bir listesini verecektir:

find . -name '*.*' -type f | xargs wc -l

2

Oyuna biraz geç kaldım, ancak dirseğin büyüklüğü nedeniyle yukarıdakilerle ilgili bir sürü tartışma hatası aldım. Bu benim için çalıştı:

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


0

catdosyaları bir tanede bir araya getirir ve her şeyi stdout'a çıkarır, wc -lbir dizindeki toplam dosya satırı sayısı için bunu yapabilirsiniz :

cat /path/to/directory/* | wc -l

0

Sadece aşağıdakiler için @ malyy cevabını artıracağım (bir yorum için büyük):

Toplamda kaç satır var

Birçok cevap ile wckomut satırı dosya seçeneğini kullanıyor xargs. Bununla ilgili sorun, xargs'ın oldukça küçük platforma bağımlı bir boyutla sınırlı olmasıdır.

Ayrıca, BSD (macOS) ve GNU (linux / homebrew) arasında bir fark vardır wc.

GNU, idealdir çünkü dosya listesini arguments ( --files0) yerine bir dosyadan okuyabilir .

Eğer mac üzerindeyseniz ve homebrew kullanıyorsanız, şunları yapmalısınız:

find . -name "*.pl" -print0 | gwc -l --files0=-

Wc yerine gwc'ye dikkat edin .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.