Bagaimana cara menghitung garis teks?

14

Bagaimana saya menghitung berapa banyak baris dalam file teks. misalnya:

command file.txt

Catatan, saya hanya ingin menghitung garis yang tidak kosong (garis tanpa menghitung spasi dan tab putih) ?.

pengguna93097373
sumber
4
Pertanyaannya tidak terdefinisi dengan baik: apakah baris dengan spasi kosong (spasi dan TAB) dianggap kosong?
Rmano
Tutup pemilih : Pertanyaan diedit setelah klarifikasi @Rmano menurut komentarnya oleh OP. Jadi tolong jangan memilih untuk ditutup sebagai Tidak Jelas
αғsнιη
2
@ Kassi masih belum jelas. Saya tidak mengerti apakah OP ingin menghitung garis sa hanya dengan spasi putih (spasi, tab, \r) atau lewati saja. Saat ini menjawab semua menghitung baris dengan spasi dan hanya melewati yang kosong.
terdon
@terdon OP JANGAN ingin menghitung garis kosong (termasuk garis kosong ( \ratau \n), garis-dengan-hanya-tab dan garis-dengan-hanya-spasi) dan ingin melewati mereka seperti yang saya pikirkan dan menjawab sesuai dengan apa yang saya mengerti.
αғsнιη

Jawaban:

11

Jawaban di atas benar tetapi sedikit berbeda, Anda dapat menggunakan grepuntuk kode yang lebih mudah seperti itugrep -vc '^$' file.txt

Misalnya (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

Misalnya (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

Perhatikan hasilnya 4! padahal yang kita inginkan hanya dua. tetapi ini juga menghitung tab di antara konten dan komentar.

Perhatikan hitung dari 0 dan hitung dari 1 berbeda dari grep ke sed karena saya ingat untuk detail lebih lanjut cari grep atau sed.

amrx
sumber
1
Kedua contoh Anda akan menghitung baris kosong, tetapi OP meminta perintah untuk menghitung semuanya TETAPI baris kosong
kos
2
Sebenarnya saya salah, sedpilihannya benar, tetapi yang grepsatu tidak
kos
Menjadi hanya sebagian benar saya menurunkan jawaban, berikan saya komentar ketika Anda sudah memperbaikinya sehingga saya dapat menghapus downvote saya
kos
1
@kos Saya cukup yakin, Anda perhatikan betapa samar-samar pertanyaannya?
amrx
2
@kos, Anda benar di tempat pertama, Terima kasih. Saya belum tidur lebih dari 36 jam, saya kira waktunya untuk tidur!
amrx
12

Coba sed:

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

Jika Anda memiliki baris yang hanya berisi spasi atau tab dan jika Anda ingin mengabaikannya juga dari hitungan:

sed '/^[[:blank:]]*$/d' file.txt | wc -l
heemayl
sumber
3
Saya akan gunakan ^\s*$juga untuk mempertimbangkan baris akun yang hanya berisi tab atau spasi.
Sylvain Pineau
@SylvainPineau: Ditambahkan ..
heemayl
1
Saya setuju bahwa itu tidak jelas dari pertanyaan OP, tetapi teks dengan spasi / tab dapat mengubah hasil yang diharapkan, +1.
Sylvain Pineau
3

Menggunakan grep:

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

Kamu bisa memakai:

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

Jika Anda memerlukan perintah untuk itu, tempel saja baris berikut ke dalam Anda .bashrcdan mulai kembali sesi shell Anda atau buka terminal baru:

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

Contoh:

count_lines file.txt
42
Sylvain Pineau
sumber
2

Dengan :

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

Penjelasan:

The NFmenunjukkan jumlah total bidang, dan karenanya ini mencetak hanya garis non-kosong , karena dalam garis non-kosong NFlebih besar dari 0dan mengevaluasi ke true. Jadi, tambah flag count ketika awk menemukan garis yang tidak kosong dan cetak nilai flag count terbaru di akhir END{print count}.

αғsнιη
sumber
1

Sunting : Anda bisa menambahkan copsi grepdaripada wcmemipis semuanya , lihat jawaban @ muru untuk versi yang lebih ringkas


Dengan grep:

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

Solusi Perl

Perl dapat melakukannya. Secara umum garis penghitungan berfungsi seperti itu:

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

Jika kami ingin mengecualikan semua baris kosong, kami akan melakukan sesuatu seperti ini:

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

Katakanlah kita memiliki file input seperti ini

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

Ada total 5 baris, 2 baris kosong. Perintah yang kita miliki akan menampilkan:

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

Peningkatan multi-file

Ini berfungsi baik untuk satu file. Jika kita ingin membuatnya berfungsi pada banyak file, kita dapat melakukan sesuatu seperti ini:

$ 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
Sergiy Kolodyazhnyy
sumber