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.
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.
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:
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)
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.
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).
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.
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 < file.txt
melakukan pekerjaan dengan tepat dan ringkas.Jawaban:
Coba dengan cara ini:
sumber
wc -l
tidak boleh memancarkannya, dan mengapa ksh akan menambahkan keluaran standar dari sebuah program dengan spasi?4711 [stdin]
output.printf "%'d"
, yang menangani ruang dan mencetak sejumlah besar dengan baik.Menurut halaman manual (untuk versi BSD, saya tidak memiliki versi GNU untuk memeriksa):
sumber
wc -l < file.txt
memiliki efek yang sama.wc -l < file.txt
untuk menghindari penggunaan kucing yang tidak berguna. Meskipun Anda benar-benar gila jika Anda berpikir bahwa itu menghabiskan waktu yang nyata.Untuk melakukan ini tanpa ruang utama, mengapa tidak:
sumber
wc -l < file.txt
untuk memperbaiki kesalahan parse dan menghapus spasi:wc -l < file.txt | bc
Bagaimana tentang
yaitu pipa keluaran
wc
kecut
(di mana pembatas adalah spasi dan pilih saja bidang pertama)sumber
wc -l file.txt | awk '{print $1}'
OP mencoba.wc -l < file.txt
metodenya. Tetapi harus digunakan| cut -d' ' -f2
pada BSD, selamawc
perintah mengembalikan spasi terkemuka, contoh: "34068289 file.txt", bukan "34068289 file.txt".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 lakukanwc -l
.echo -n
menghilangkan jeda baris trailing.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 yanggrep
berfungsi untuk menghitung garis, tetapi bukan karakter.bc
adalah yang paling ringkas, danawk
danperl
tampak 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).sumber
echo $(printf '%s' "$FOO" | wc -c)
adalah salah satu kesempatan langka ketikaecho
dengan subshitusi perintah tidak sia-sia.echo `echo $FOO`;
juga bertindak seperti perintah String.trim () pada variabel! Itu sangat berguna. Saya juga akan menambahkan baris Anda ke jawaban saya.printf
lebih baik daripadaecho
?Bagaimana tentang
sumber
grep
tetapi memeriksa ini ternyata (tidak mengejutkan) menjadi 2x hingga 6x lebih lambat daripada metode yang lebih sederhana / mudahwc
dalam pengujian saya.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:]
.sumber
test9
dengan 1 baris di dalamnya, output akan menjadi 19.Cara terbaik adalah pertama-tama menemukan semua file dalam direktori kemudian gunakan AWK NR (Number of Records Variable)
di bawah ini adalah perintahnya:
contoh: -
find /tmp/ -type f | awk 'END{print NR}'
sumber
Ini bekerja untuk saya menggunakan normal
wc -l
dansed
untuk menghapus arang apa pun yang bukan angka.sumber