Dosya adı olmayan satır sayısını yazdırmak için “wc -l” nasıl alınır?


155
wc -l file.txt

satır sayısını ve dosya adını verir.

Sadece numaraya ihtiyacım var (dosya adını değil).

bunu yapabilirim

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

Ama belki daha iyi bir yol var mı?


13
wc -l < file.txtişi kesin ve kısaca yapar.
Jonathan Leffler


3
Bu, şimdi iki kez aradığım bir soru. Wc'nin bu davranışı -nix olağan tersliği için sezgisel ve anti-paradigmatiktir. Eğer Çünkü terseness bir sebebi var tam olarak yok kabarık fazlalık her türlü etrafında çalışmak istiyorum. Sonuçta , dosya adını biliyorum , değil mi? İstediğim satır sayısı.
Peter - Monica'yı

Yanıtlar:


217

Bu şekilde deneyin:

wc -l < file.txt

5
AIX, ksh'da, bunun her zaman sayının önünde bir boşluk olacaktır. Kullanmalıyız | boşlukları kesmek için awk '{print $ 1}' veya bir kesim. Kırpmanın bir başka yolu, bir yankı ile çevrelenmektir.
rao

@ rao doğru, bu sayıdan önce bir boşluk ekleyecektir. Çözümüm bunu çözüyor ve awk veya cut'tan daha basit.
Desi Cochrane

@rao Bash ile yer yok. Uzay ksh cinsinden nereden geliyor? wc -lbir tane yayınlamamalı ve neden ksh bir programın standart çıktısını boşlukla doldursun?
Peter - Monica'yı eski

Bu doğru çözüm olsa da (ve wc'nin hiç değiştirilmemesi yeterince kolaydır), muhtemelen daha yavaş ve sezgisel değildir. Birincisi, 4711 [stdin]çıktı gibi bir şey beklerdim .
Peter - Monica'yı

Ayrıca printf "%'d", alanla ilgilenen ve çok sayıda güzel baskı yapan eşleştirmeyi de düşünün .
Leo

21
cat file.txt | wc -l

Göre adam sayfası (BSD sürümü için, ben çek bir GNU versiyonunu yok):

Hiçbir dosya belirtilmezse, standart giriş kullanılır ve hiçbir dosya adı görüntülenmez. İstem, çoğu ortamda EOF veya [^ D] alınana kadar girişi kabul eder.


3
Kedi sevmiyorum - birleştirme çok zaman alıyor.
PoGibas

9
wc -l < file.txtaynı etkiye sahiptir.
pjmorse

@user: Test edin. Şimdiye kadar en yavaş kısım dosyayı diskten okumak olacaktır.
sarnold

11
@ user1286528 sonra wc -l < file.txtkedinin gereksiz kullanımını önlemek için kullanın. Her ne kadar fark edilir bir zaman harcadığını düşünüyorsanız kesinlikle delirmişsinizdir.
Ocaklar

12

Bunu lider alan olmadan yapmak için, neden olmasın:

wc -l < file.txt | bc

Bununla sözdizimi hataları alıyorum (Ubuntu 14.04). Dosya adıyla ilgili bir sorun olduğunu düşünüyorum.
MERose

Bir RHEL 6.7 üzerinde hatalar yaratır: $ wc -l file.csv | bc (standard_in) 1: sözdizimi hatası (standard_in) 1: geçersiz karakter: N (standart_in) 1: sözdizimi hatası (standard_in) 1: sözdizimi hatası
Rodrigo Hjort

3
Ayrıştırma hatası da alıyorum, ancak ayrıştırma hatasını wc -l < file.txtdüzeltmek ve alanı kaldırmak için bunu diğer yanıtla birleştirebilirsiniz :wc -l < file.txt | bc
jangosteve

11

Peki ya

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

yani çıkışını boru wciçine cutekleyin (sınırlayıcıların boşluk olduğu ve sadece ilk alanı seçtiği)


4
Bu wc -l file.txt | awk '{print $1}'OP'nin denediğinden daha iyi değil .
doubleDown

1
wc -l < file.txtYöntemden daha hızlı . Ancak komut önde gelen bir alan döndürdüğü | cut -d' ' -f2sürece wcBSD'de kullanılmalıdır, örnek: "34068289 file.txt" yerine "34068289 file.txt".
Sopalajo de Arrierez

awk kullanmak, bir testere yerine bir tahta kesmek için bir CNC makinesi kullanmak gibidir. Testere için bir testere kullanın.
Peter - Monica'yı

5

Tekniklerin Karşılaştırılması

Sağladığım önde gelen boşluk olmadan karakter sayımı almaya çalışan benzer bir sorun yaşadım wc, bu da beni bu sayfaya götürdü. Buradaki yanıtları denedikten sonra, Mac'teki kişisel testimin (BSD Bash) sonuçları aşağıdadır. Yine, bu karakter sayımı içindir; yapacağınız satır sayısı için wc -l. echo -nizleyen satır sonunu atlar.

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"           (√)

cut -f*Genel olarak yönteme güvenmem, çünkü herhangi bir çıktının sahip olabileceği lider alanların tam sayısını bilmenizi gerektirir. Ve grepsatırları saymak için çalışır, ancak karakterleri değil.

bcEn özlü ve awkve perlbiraz overkill görünüyor, ama hepsi nispeten hızlı ve taşınabilir yeterli olmalı.

Ayrıca, bunlardan bazılarının çevredeki boşlukları genel dizelerden de ( echo `echo $FOO`başka bir düzgün numara ile birlikte) kırpacak şekilde uyarlanabileceğini unutmayın .


1
echo $(printf '%s' "$FOO" | wc -c)echobir komutla subshitution'un işe yaramadığı nadir durumlardan biridir .
tripleee

@tripleee Whoa ... kodunuza dayanarak echo `echo $FOO`;, bir değişken üzerinde String.trim () komutu gibi davranır! Bu inanılmaz kullanışlı. Cevabımı da satırına ekleyeceğim.
Beejor



4

Peki ya

grep -ch "^" file.txt

3
Güzel. Çok orijinal / yaratıcı kullanımı, grepancak bunu kontrol etmek, (şaşırtıcı bir şekilde) wctestlerimdeki basit / basit yöntemden 2x ila 6x daha yavaş olduğu ortaya çıkıyor .
arielf

3

Açıkçası, buna birçok çözüm var. İşte bir tane daha:

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

Bu, yalnızca satır sayısını verir, ancak sondaki yeni satır karakteri ( \n) bunu da istemiyorsanız, değiştirme mevcut [:blank:]olan [:space:].


Dosya adında bir numara olduğunda bu sorun vardır. Örneğin, test9içinde 1 satır bulunan dosya için çıktı 19 olacaktır.
Raphael Ahrens

1

En iyi yol, önce dizindeki tüm dosyaları bulmak sonra AWK NR (Kayıt Sayısı Değişkeni) kullanmak olacaktır.

komut aşağıdadır:

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

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


0

Benim için bu çalışmalar, normal kullanılarak wc -lve sedbir sayı değil ne herhangi bir karakter şerit.

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

# 9249133
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.