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?


13
wc -l < file.txtmelakukan pekerjaan dengan tepat dan ringkas.
Jonathan Leffler


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

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.


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

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)


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).


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



4

Bagaimana tentang

grep -ch "^" file.txt

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:].


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}'


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.