dosyadaki satırları say


64

Bunu yapmanın pek çok yolu olduğundan eminim: bir metin dosyasındaki satır sayısını nasıl sayabilirim?

$ <cmd> file.txt
1020 lines

Yanıtlar:


98

Standart yol, wcneyin sayılması gerektiğini (bayt, karakter, sözcük vb.) Belirtmek için argümanları almaktır; -lçizgiler içindir:

$ wc -l file.txt
1020 file.txt

Yorumları yoksaymak istersem dosyadaki satırları nasıl sayabilirim ? Özellikle, istediğiniz değil bir + ile başlayan satırları saymak, bazı beyaz boşluk açıklama hatları MATLAB dosyasının bir git diff görünen yoludur sonra bir% (hiçbir beyaz boşluk olabilir). Bunu grep ile yapmaya çalıştım ama doğru normal ifadeyi bulamadım.
Gdalya

@Gdalya aşağıdaki boru hattı (herhangi bir test perfomed edildi) bunu umuyoruz: cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l. eşleşirse /regexp/dbir satırı siler regexpve bunun -eiçin yeterli (IMNSHO) sözdizimini açar regexp.
dbanet

2
Neden basitçe değil grep -v '^+ *%' matlab.git.diff | wc -l?
celtschk

@celtschk, yorum satırlarında her zaman olduğu gibi: grepkomut durumunuzu şöyle yorumlamak için değiştirmek mümkün müdür " + Hello"(önce boşlukları not edin +)?
Sopalajo de Arrierez,

1
@SopalajodeArrierez: Tabii ki mümkün: grep -v '^ *+' matlab.git.diff | wc -l(Fiyat işaretlerinin aslında satırın bir parçası olmadığını farz ediyorum; ayrıca önünde boşluk olan ve olmayan satırların +da yorum anlamına geldiğini farz ediyorum ; en az bir boşluk yıldızı yerine ya zorunludur *ile \+), ya da sadece yıldızın önünde de bir boşluk ekleyin. Muhtemelen sadece boşlukları eşleştirmek yerine, rastgele boşluk ile eşleştirmek istersiniz; Bunun için boşluğu ile değiştirin [[:space:]]. Ayrıca %, örneğinizde olmadığı için eşleştirmeyi de kaldırdığımı unutmayın.
celtschk

15

Michael'ın dediği gibi, wc -lgitmenin yolu bu. Ama her ihtimale karşı sen açıklanamaz var bash, perlya awkancak wc, burada birkaç çözümler şunlardır:

Bash okunur

$ LINECT=0; while read -r LINE; do (( LINECT++ )); done < file.txt; echo $LINECT

Perl Çözümleri

$ perl -lne 'END { print $. }' file.txt

ve çok daha az okunabilir:

$ perl -lne '}{ print $.' file.txt

Awk Çözümü

$  awk 'END {print NR}' file.txt

15

Steven D GNU’yu unuttu sed:

sed -n '$=' file.txt

Ayrıca, dosya adını çıkarmadan sayımı istiyorsanız ve kullanıyorsanız wc:

wc -l < file.txt

Sadece bunun için:

cat -n file.txt | tail -n 1 | cut -f1

2
Veya grep -c '', veya tr -dc '\n' | wc -c, veya nl -ba -nln | tail -n 1 |sed -e 's/[^0-9].*//'... Bunlardan herhangi biri kendi başına (satır sayımdan daha fazlasını yapan bir program yapmak için üzerine inşa edilenlerin aksine), wc -lsaf (ba) sh dışında yararlı olabilir mi?
Gilles,

1
@Gilles: Bence sorudaki "birçok yol" ifadesi, Steve ile benim birlikte olduğum bir mücadeleyi tetikledi.
Dennis Williamson,

1
@Gilles:sed 's/.*//' file.txt | uniq -c
Dennis Williamson,

2
@Gilles: Oh, önce sen demek istedin . uniq -c -w 0 file.txtve cut -c -7sadece numarayı tutabilirsin. Ya da daha POSIXly: uniq -c file.txt | awk '{c+=$1}END{print c}'. Peki ya dc(POSIX olmasa da)? uniq -c file.txt | cut -c -7 | sed '$alax' | dc -e '[pq]sb[+z1=blax]sa' -. bcPOSIX geçerli: uniq -c file.txt | cut -c -7 | sed -n ':a;${s/\n/ + /gp;b};N;ba' | bc. Kolay cevap Sınırlı bir çizgi uzunluğu varsayarsak: uniq -c -f 100000 file.txt.
Dennis Williamson,

1
@JosipRodin: Tırnak eklendi
Dennis Williamson

11

Kullanırken uyarı kelimesi

wc -l

çünkü wc -l \ n'yi sayarak çalışır, eğer dosyanızdaki son satır yeni satırda etkin bir şekilde bitmiyorsa satır sayısı 1 ile kapalı olacaktır (bu nedenle eski kural, satırın sonunda newline bırakarak)

Herhangi bir dosyanın son satırı yeni bir satırla sonlandırma kuralını takip edip etmediğinden emin olamadığım için, yeni satırı ne olursa olsun sayıma son satırı içerecek alternatif komutlardan herhangi birini kullanmanızı öneririm.

sed -n $= filename
perl -lne 'END { print $. }' filename
awk 'END {print NR}' filename
grep -c '' filename

güzel özeti. Ve unix & linux'a
Sebastian

Hm son parça gerçekten çizgi mi?
gena2x

1
Eminim herkesin kullanım alanına bağlı; Çünkü 'son parça' genellikle birinin yeni bir satırla yazamadığı bir metin satırıdır. En sık karşılaştığım usecase, yeni bir satırda bitmeyen tek bir metin dizesi içeren bir dosya. wc -l, "1" sayılmasını beklediğimde bunu "0" olarak sayardı.
pretzels1337

3

Yalnızca bash ve kesinlikle hiçbir harici araca sahip değilseniz, aşağıdakileri de yapabilirsiniz:

count=0
while read
do
  ((count=$count+1))
done <file.txt
echo $count

Açıklama: döngü standart girdi satırını satır satır okur ( read; yine de okuma girişi ile hiçbir şey yapmadığımız için onu saklamak için hiçbir değişken yoktur) ve değişkeni counther seferinde arttırır . Yeniden yönlendirme nedeniyle ( <file.txtsonra done), döngü için standart giriş file.txt.


2

Komutu her zaman grepaşağıdaki gibi kullanabilirsiniz :

grep -c "^" file.txt

file.txtSon satırında sonunda bir LF karakteri bulunup bulunmadığına bakılmaksızın, tüm gerçek satırları sayar .

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.