Bagaimana cara mendapatkan "wc-l" untuk mencetak jumlah baris tanpa nama file?

155
wc -l file.txt

menampilkan jumlah baris dan nama file.

Saya hanya perlu nomor itu sendiri (bukan nama file).

aku bisa melakukan ini

 wc -l file.txt | awk '{print $1}'

Tapi mungkin ada cara yang lebih baik?

PoGibas
sumber
13
wc -l < file.txtmelakukan pekerjaan dengan tepat dan ringkas.
Jonathan Leffler
2
Kemungkinan duplikat dari get hanya integer dari wc di bash
Ciro Santilli郝海东冠状病六四事件法轮功
3
Ini adalah pertanyaan yang saya cari dua kali sekarang. Perilaku wc ini tidak intuitif dan anti-paradigmatik untuk-nix yang biasa. Kesempitan itu ada karena suatu alasan, karena Anda sebenarnya tidak ingin mengatasi semua jenis redundansi yang mengembang. Lagi pula, saya tahu nama filenya, bukan? Yang saya inginkan adalah jumlah baris.
Peter - Reinstate Monica

Jawaban:

217

Coba dengan cara ini:

wc -l < file.txt
Norman Ramsey
sumber
5
Di AIX, ksh, ini akan selalu memiliki ruang sebelum nomor. Kita harus menggunakan | awk '{print $ 1}' atau potongan, untuk memotong spasi. Cara lain untuk memotong adalah dengan melampirkan dengan gema.
rao
@rao benar, ini akan menambah spasi sebelum nomor. Solusi saya memecahkan ini dan lebih sederhana daripada awk atau dipotong.
Desi Cochrane
@rao Tidak ada ruang dengan bash. Dari mana asal ruang di ksh? wc -ltidak boleh memancarkannya, dan mengapa ksh akan menambahkan keluaran standar dari sebuah program dengan spasi?
Peter - Reinstate Monica
Meskipun ini adalah solusi yang tepat (dan cukup mudah bahwa kita tidak pernah diamandemen), kemungkinannya lebih lambat dan tidak intuitif. Untuk satu, saya mengharapkan sesuatu seperti 4711 [stdin]output.
Peter - Reinstate Monica
Juga pertimbangkan berpasangan dengan printf "%'d", yang menangani ruang dan mencetak sejumlah besar dengan baik.
Leo
21
cat file.txt | wc -l

Menurut halaman manual (untuk versi BSD, saya tidak memiliki versi GNU untuk memeriksa):

Jika tidak ada file yang ditentukan, input standar digunakan dan tidak ada nama file yang ditampilkan. Prompt akan menerima input hingga menerima EOF, atau [^ D] di sebagian besar lingkungan.

pjmorse
sumber
3
Saya tidak suka kucing - penggabungan menghabiskan banyak waktu.
PoGibas
9
wc -l < file.txtmemiliki efek yang sama.
pjmorse
@ pengguna: Uji itu. Sejauh ini bagian paling lambat akan membaca file dari disk.
sarnold
11
@ user1286528 lalu gunakan wc -l < file.txtuntuk menghindari penggunaan kucing yang tidak berguna. Meskipun Anda benar-benar gila jika Anda berpikir bahwa itu menghabiskan waktu yang nyata.
hobbs
12

Untuk melakukan ini tanpa ruang utama, mengapa tidak:

wc -l < file.txt | bc
Desi Cochrane
sumber
Saya mendapatkan kesalahan sintaksis dengan ini (Ubuntu 14.04). Saya pikir ada masalah dengan nama file.
MERose
Pada RHEL 6.7 itu menimbulkan kesalahan: $ wc -l file.csv | bc (standard_in) 1: kesalahan sintaks (standard_in) 1: karakter ilegal: N (standard_in) 1: kesalahan sintaks (standard_in) 1: kesalahan sintaksis
Rodrigo Hjort
3
Saya juga mendapatkan kesalahan parse, tetapi Anda dapat menggabungkan ini dengan jawaban lain yang digunakan wc -l < file.txtuntuk memperbaiki kesalahan parse dan menghapus spasi:wc -l < file.txt | bc
jangosteve
11

Bagaimana tentang

wc -l file.txt | cut -d' ' -f1

yaitu pipa keluaran wcke cut(di mana pembatas adalah spasi dan pilih saja bidang pertama)

Neil Albert
sumber
4
ini tidak lebih baik daripada wc -l file.txt | awk '{print $1}'OP mencoba.
doubleDown
1
Lebih cepat dari wc -l < file.txtmetodenya. Tetapi harus digunakan | cut -d' ' -f2pada BSD, selama wcperintah mengembalikan spasi terkemuka, contoh: "34068289 file.txt", bukan "34068289 file.txt".
Sopalajo de Arrierez
@doubleDown dengan baik, menggunakan awk seperti menggunakan mesin CNC untuk memotong papan, bukan gergaji. Gunakan gergaji untuk menggergaji.
Peter - Reinstate Monica
5

Perbandingan Teknik

Saya memiliki masalah serupa yang berusaha untuk mendapatkan jumlah karakter tanpa spasi kosong terkemuka yang disediakan oleh wc, yang membawa saya ke halaman ini. Setelah mencoba jawabannya di sini, berikut ini adalah hasil dari pengujian pribadi saya pada Mac (BSD Bash). Sekali lagi, ini untuk jumlah karakter; untuk jumlah baris yang akan Anda lakukan wc -l. echo -nmenghilangkan jeda baris trailing.

FOO="bar"
echo -n "$FOO" | wc -c                          # "       3"    (x)
echo -n "$FOO" | wc -c | bc                     # "3"           (√)
echo -n "$FOO" | wc -c | tr -d ' '              # "3"           (√)
echo -n "$FOO" | wc -c | awk '{print $1}'       # "3"           (√)
echo -n "$FOO" | wc -c | cut -d ' ' -f1         # "" for -f < 8 (x)
echo -n "$FOO" | wc -c | cut -d ' ' -f8         # "3"           (√)
echo -n "$FOO" | wc -c | perl -pe 's/^\s+//'    # "3"           (√)
echo -n "$FOO" | wc -c | grep -ch '^'           # "1"           (x)
echo $( printf '%s' "$FOO" | wc -c )            # "3"           (√)

Saya tidak akan bergantung pada cut -f*metode ini secara umum karena ini mengharuskan Anda mengetahui jumlah pasti dari ruang terdepan yang mungkin dimiliki keluaran apa pun. Dan yang grepberfungsi untuk menghitung garis, tetapi bukan karakter.

bcadalah yang paling ringkas, dan awkdan perltampak sedikit berlebihan, tetapi mereka semua harus relatif cepat dan cukup portabel.

Juga perhatikan bahwa beberapa di antaranya dapat disesuaikan untuk memangkas ruang putih di sekitarnya dari string umum, juga (bersama dengan echo `echo $FOO`, trik lain yang rapi).

Beejor
sumber
1
echo $(printf '%s' "$FOO" | wc -c)adalah salah satu kesempatan langka ketika echodengan subshitusi perintah tidak sia-sia.
tripleee
@tripleee Whoa ... berdasarkan kode Anda, echo `echo $FOO`;juga bertindak seperti perintah String.trim () pada variabel! Itu sangat berguna. Saya juga akan menambahkan baris Anda ke jawaban saya.
Beejor
Mungkin untuk konteks, lihat juga Kapan membungkus tanda kutip di sekitar variabel shell
tripleee
4

Bagaimana tentang

grep -ch "^" file.txt
MeIsMich
sumber
3
Bagus. Sangat orisinal / kreatif digunakan greptetapi memeriksa ini ternyata (tidak mengejutkan) menjadi 2x hingga 6x lebih lambat daripada metode yang lebih sederhana / mudah wcdalam pengujian saya.
arielf
3

Jelas, ada banyak solusi untuk ini. Ini satu lagi:

wc -l somefile | tr -d "[:alpha:][:blank:][:punct:]"

Ini hanya menghasilkan jumlah baris, tetapi karakter baris baru ( \n) ada, jika Anda tidak menginginkannya, ganti [:blank:]dengan [:space:].

Bouchaala Reda
sumber
Ini memiliki masalah ketika nama file memiliki nomor di dalamnya. Misalnya untuk file test9dengan 1 baris di dalamnya, output akan menjadi 19.
Raphael Ahrens
1

Cara terbaik adalah pertama-tama menemukan semua file dalam direktori kemudian gunakan AWK NR (Number of Records Variable)

di bawah ini adalah perintahnya:

find <directory path>  -type f | awk  'END{print NR}'

contoh: - find /tmp/ -type f | awk 'END{print NR}'

pengguna128364
sumber
0

Ini bekerja untuk saya menggunakan normal wc -ldan seduntuk menghapus arang apa pun yang bukan angka.

wc -l big_file.log | sed -E "s/([a-z\-\_\.]|[[:space:]]*)//g"

# 9249133
joseluisq
sumber