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
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:
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
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.
grep -v '^+ *%' matlab.git.diff | wc -l?
grepkomut durumunuzu şöyle yorumlamak için değiştirmek mümkün müdür " + Hello"(önce boşlukları not edin +)?
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.
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:
$ LINECT=0; while read -r LINE; do (( LINECT++ )); done < file.txt; echo $LINECT
$ perl -lne 'END { print $. }' file.txt
ve çok daha az okunabilir:
$ perl -lne '}{ print $.' file.txt
$ awk 'END {print NR}' file.txt
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
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?
sed 's/.*//' file.txt | uniq -c
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.
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
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.