Saya yakin ada banyak cara untuk melakukan ini: bagaimana saya bisa menghitung jumlah baris dalam file teks?
$ <cmd> file.txt
1020 lines
Saya yakin ada banyak cara untuk melakukan ini: bagaimana saya bisa menghitung jumlah baris dalam file teks?
$ <cmd> file.txt
1020 lines
Jawaban:
Cara standarnya adalah dengan wc
, yang membutuhkan argumen untuk menentukan apa yang harus dihitung (byte, karakter, kata-kata, dll.); -l
untuk garis:
$ wc -l file.txt
1020 file.txt
cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l
. /regexp/d
menghapus baris jika cocok regexp
, dan -e
mengaktifkan sintaks (IMNSHO) yang memadai untuk regexp
.
grep -v '^+ *%' matlab.git.diff | wc -l
?
grep
perintah Anda untuk mempertimbangkan sebagai kasus komentar seperti " + Hello"
(perhatikan spasi sebelum +
)?
grep -v '^ *+' matlab.git.diff | wc -l
(Saya berasumsi tanda kutip sebenarnya tidak dimaksudkan untuk menjadi bagian dari garis; Saya juga berasumsi bahwa kedua garis dengan dan tanpa spasi di depan +
dimaksudkan untuk menjadi komentar; jika pada paling tidak satu ruang wajib, ganti bintang *
dengan \+
, atau cukup tambahkan ruang lain di depan bintang). Mungkin alih-alih hanya mencocokkan spasi, Anda ingin mencocokkan spasi putih sewenang-wenang; untuk ini ganti spasi dengan [[:space:]]
. Perhatikan bahwa saya juga menghapus pencocokan %
karena tidak ada dalam contoh Anda.
Seperti kata Michael, wc -l
adalah jalan yang harus ditempuh. Tapi, hanya dalam kasus Anda bisa dijelaskan memiliki bash
, perl
atau awk
tapi tidak wc
, berikut adalah beberapa solusi yang lebih:
$ LINECT=0; while read -r LINE; do (( LINECT++ )); done < file.txt; echo $LINECT
$ perl -lne 'END { print $. }' file.txt
dan yang jauh lebih mudah dibaca:
$ perl -lne '}{ print $.' file.txt
$ awk 'END {print NR}' file.txt
Steven D lupa GNU sed
:
sed -n '$=' file.txt
Juga, jika Anda ingin menghitung tanpa mengeluarkan nama file dan Anda menggunakan wc
:
wc -l < file.txt
Hanya untuk itu:
cat -n file.txt | tail -n 1 | cut -f1
grep -c ''
, atau tr -dc '\n' | wc -c
, atau nl -ba -nln | tail -n 1 |sed -e 's/[^0-9].*//'
... Apakah semua ini berguna dalam dirinya sendiri (sebagai lawan dari hal-hal yang dibangun untuk membuat program yang lebih dari menghitung garis), selain wc -l
dan murni (ba) sh?
sed 's/.*//' file.txt | uniq -c
uniq -c -w 0 file.txt
dan Anda hanya bisa cut -c -7
menyimpan nomornya saja. Atau, lebih POSIXly: uniq -c file.txt | awk '{c+=$1}END{print c}'
. Bagaimana dc
(walaupun itu bukan POSIX)? uniq -c file.txt | cut -c -7 | sed '$alax' | dc -e '[pq]sb[+z1=blax]sa' -
. bc
adalah POSIX: uniq -c file.txt | cut -c -7 | sed -n ':a;${s/\n/ + /gp;b};N;ba' | bc
. Mudah jawaban jika Anda menganggap panjang garis yang terbatas: uniq -c -f 100000 file.txt
.
Kata peringatan saat menggunakan
wc -l
karena wc -l berfungsi dengan menghitung \ n, jika baris terakhir dalam file Anda tidak berakhir di baris baru secara efektif, jumlah baris akan dimatikan oleh 1. (maka konvensi lama meninggalkan baris baru di akhir file Anda)
Karena saya tidak pernah bisa memastikan apakah ada file yang diberikan mengikuti konvensi untuk mengakhiri baris terakhir dengan baris baru atau tidak, saya sarankan menggunakan salah satu dari perintah alternatif ini yang akan menyertakan baris terakhir dalam hitungan terlepas dari baris baru atau tidak.
sed -n $= filename
perl -lne 'END { print $. }' filename
awk 'END {print NR}' filename
grep -c '' filename
Jika Anda hanya memiliki bash dan sama sekali tidak ada alat eksternal yang tersedia, Anda juga dapat melakukan hal berikut:
count=0
while read
do
((count=$count+1))
done <file.txt
echo $count
Penjelasan: loop membaca input standar baris demi baris ( read
; karena kita tidak melakukan apa-apa dengan input read, tidak ada variabel yang disediakan untuk menyimpannya), dan meningkatkan variabel count
setiap kali. Karena pengalihan ( <file.txt
setelah done
), input standar untuk loop adalah dari file.txt
.