Metin satırlarını nasıl sayarım?


14

Metin dosyasında kaç satır olduğunu nasıl sayabilirim. Örneğin :

command file.txt

Not: Yalnızca boş olmayan satırları saymak istiyorum (boşluk ve sekme saymayan satırlar)?



4
Soru iyi tanımlanmamıştır: yalnızca boşluk (boşluklar ve SEKME) boş olan bir satır mı?
Rmano

Yakın seçmenler : Soru göre Rmano en açıklama @ sonra düzenlenmiş onun comment OP tarafından. Unclear
αғsнιη

2
@KasiyA hala belirsiz. OP'nin yalnızca boşlukla (boşluklar, sekmeler \r) sa satırını saymak veya atlamak isteyip istemediğini anlamıyorum . Geçerli tüm satırları boşluklu olarak cevaplar ve yalnızca boş olanları atlar.
terdon

@terdon OP DO NOT (boş hatları (dahil boş-satırları sayma istiyorum \rya \n), çizgiler-ile-only-sekmeler ve çizgilerle-ile-only-boşluk) ve sanırım onları atlamak istiyor ve cevaplandırılması göre Ne anladım.
αғsнιη

Yanıtlar:


11

Yukarıdaki cevap doğru ama biraz farklı, grepdaha kolay kod içingrep -vc '^$' file.txt

Örneğin (A): file.txt

$grep -vc '^$' file.txt

1    First line         #This is two tabs to comment.
2    
4
3    Fourth line        #Another two tabs to comment.

$2

Örneğin (B): file.txt

$sed '/^$/d' file.txt | wc -l

1    First line         #This is two tabs to comment.
2    
4
3    Fourth line        #Another two tabs to comment.

$4

Sonucun 4 olduğuna dikkat edin! sadece iki tane beklemek istediğimizde. ancak bu, içerik ve yorum arasındaki sekmeleri sayar.

Daha fazla ayrıntı için grep veya sed aramasını hatırladığım için 0'dan sayımlara dikkat edin ve 1'den grep'ten sed'e kadar sayar.


1
Her iki örneğiniz de boş satırları sayacak, ancak OP her şeyi saymak için bir komut istedi ama ANCAK boş satırları
kos

2
Aslında yanılıyorum, sedseçenek aslında doğrudur, ama grepbiri değil
kos

Kısmen doğru olmak cevabı indirdim, düzelttiğinizde bana bir yorum bırakın, böylece aşağı oyumu kaldırabilirim
kos

1
@kos Eminim, sorunun ne kadar belirsiz olduğunu fark ettiniz mi?
amrx

2
@kos, ilk başta haklıydın, teşekkürler. 36 saatten fazla uyumadım, sanırım yatak zamanı!
amrx

12

Deneyin sed:

sed '/^$/d' file.txt | wc -l

Yalnızca boşluk veya sekme içeren herhangi bir satırınız varsa ve bunları sayıdan da yoksaymak istiyorsanız:

sed '/^[[:blank:]]*$/d' file.txt | wc -l

3
Ben kullanırım ^\s*$Ayrıca sadece sekme veya boşluk içeren hesabı hatları içine almak.
Sylvain Pineau

@SylvainPineau: Eklendi ..
heemayl

1
OP'nin sorusundan net olmadığına katılıyorum, ancak boşluk / sekmeli metin beklenen sonucu değiştirebilir, +1.
Sylvain Pineau

3

Kullanma grep:

grep -vc '^$' file  # or
grep -vc '^\s*$' file    

3

Kullanabilirsiniz:

grep -cve '^\s*$' file.txt

Bunun için bir komuta ihtiyacınız varsa, aşağıdaki satırları kendinize yapıştırın .bashrcve kabuk oturumunuzu yeniden başlatın veya yeni bir terminal açın:

count_lines()
{
    grep -cve '^\s*$' $1
}

Misal:

count_lines file.txt
42

2

İle :

awk 'NF{++count} END{print count}' file

Açıklama:

NFDolayısıyla toplam alan sayısı ve bu baskı gösterir sadece sigara boş satır boş olmayan çizgilerle, çünkü NFdaha büyük olan 0gerçek ve değerlendirir. Yani artırmak sayım awk olmayan boş satırlar bulunca bayrağı ve baskı en son değeri sayımı ile sonunda bayrak END{print count}.


1

Düzenleme : Sadece her şeyi borulamak yerine cseçeneği ekleyebilirsiniz, daha kompakt bir sürüm için @ muru'nun cevabına bakın.grepwc


İle grep:

grep -v '^$' file.txt | wc -l

0

Perl çözeltisi

Perl bunu yapabilir. Genel olarak sayma hatları şu şekilde çalışır:

$ perl -ne 'END{print $.}' input.txt                                                                                     

Tüm boş satırları hariç tutmak istiyorsak, böyle bir şey yapacağız:

$ perl -ne '$c+=1 if not /^$|^\s+$/;END{print $c}' input.txt                                                             

Diyelim ki böyle bir girdi dosyasına sahibiz

$ cat -n input.txt
     1  Cat; Dog; Squirrel
     2  ORGANISM Animalus terrus
     3  
     4  Sequence: ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT
     5  

Toplam 5 satır, 2 boş satır var. Elimizdeki komut çıktı:

$ perl -ne '$c+=1 if not /^$|^\s+$/;END{print $c}' input.txt                                                             
3

Çoklu dosya iyileştirme

Bu, tek bir dosya için iyi çalışır. Birden fazla dosya üzerinde çalışmasını istiyorsak, böyle bir şey yapabiliriz:

$ perl -ne '$c+=1 if not /^$|^\s+$/;printf("%d %s\n",$c,$ARGV) and $c=0 if eof' input.txt /etc/passwd                    
3 input.txt
52 /etc/passwd
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.