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ı?
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ı?
Yanıtlar:
Bu şekilde deneyin:
wc -l < file.txt
wc -l
bir tane yayınlamamalı ve neden ksh bir programın standart çıktısını boşlukla doldursun?
4711 [stdin]
çıktı gibi bir şey beklerdim .
printf "%'d"
, alanla ilgilenen ve çok sayıda güzel baskı yapan eşleştirmeyi de düşünün .
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.
wc -l < file.txt
aynı etkiye sahiptir.
wc -l < file.txt
kedinin 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.
Bunu lider alan olmadan yapmak için, neden olmasın:
wc -l < file.txt | bc
wc -l < file.txt
düzeltmek ve alanı kaldırmak için bunu diğer yanıtla birleştirebilirsiniz :wc -l < file.txt | bc
Peki ya
wc -l file.txt | cut -d' ' -f1
yani çıkışını boru wc
içine cut
ekleyin (sınırlayıcıların boşluk olduğu ve sadece ilk alanı seçtiği)
wc -l file.txt | awk '{print $1}'
OP'nin denediğinden daha iyi değil .
wc -l < file.txt
Yöntemden daha hızlı . Ancak komut önde gelen bir alan döndürdüğü | cut -d' ' -f2
sürece wc
BSD'de kullanılmalıdır, örnek: "34068289 file.txt" yerine "34068289 file.txt".
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 -n
izleyen 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 grep
satırları saymak için çalışır, ancak karakterleri değil.
bc
En özlü ve awk
ve perl
biraz 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 .
echo $(printf '%s' "$FOO" | wc -c)
echo
bir komutla subshitution'un işe yaramadığı nadir durumlardan biridir .
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.
printf
iyi echo
?
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:]
.
test9
içinde 1 satır bulunan dosya için çıktı 19 olacaktır.
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}'
wc -l < file.txt
işi kesin ve kısaca yapar.