bash'da wc'den sadece tamsayı al


115

Bash'de wc'nin döndürdüğü tamsayıyı almanın bir yolu var mı?

Temel olarak satır numaralarını ve kelime sayılarını dosya adından sonra ekrana yazmak istiyorum.

output: filename linecount wordcount Şimdiye kadar sahip olduğum şeyler:

files=`ls`
for f in $files;
do
        if [ ! -d $f ] #only print out information about files !directories
        then
                # some way of getting the wc integers into shell variables and then printing them
                echo "$f $lines $ words"
        fi
done

Yanıtlar:


58

cutÇıktısının yalnızca ilk kelimesini wc(satır veya kelime sayısıdır) almak için komutu kullanabilirsiniz :

lines=`wc -l $f | cut -f1 -d' '`
words=`wc -w $f | cut -f1 -d' '`

5
Aynı dosya için wc'yi iki kez çalıştırmak verimsizdir.
gawi

3
Doğru, bu yüzden James Broadhead'in cevabının çok daha iyi olduğunu düşünüyorum. Ben alamadım cuttam çıkışını işe wc $falanlar arasında boşlukların sayısı değişir çünkü.
casablanca

1
@casablanca 'tr -s' kullanarak boşluk sayısını sıkıştırabilirsiniz. Aşağıdaki cevabımda bu soruya daha taşınabilir çözümler listeledim.
ruble

Bu cevapta bir değişkene
atadığımız için

88

Şimdiye kadarki en basit cevap:

wc < filename 

5
Ancak istenen çıktıyı üretmez.
Dave Newton

Tabii ki öyle, sadece yine de yapacağınız uygun parametreleri iletiyorsunuz. örneğin, yaparsanız wc -c < file name, size sadece tam sayı bayt verir, başka hiçbir şey vermez.
BananaNeil

13
Demek istediğim, eğer (1,5 yıllık) bir soruyu yanıtlayacaksanız, tüm bilgileri yanıta koyabilirsiniz, hepsi bu :)
Dave Newton

Hay aksi, sadece soruyu tekrar okuyun .. # başarısız, sadece tam sayıları nasıl elde edeceğimi araştırıyordum ve daha iyi bir cevap bulduğumda cevaplardan birindeki bilgileri kullanıyordum ve sonra bu konuda yayınlamaya karar verdim. üzgünüm ..
BananaNeil

3
Google'ı yanıtladınız, önemli olan bu. :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

82

Sadece:

wc -l < file_name

işi yapacak. Ancak bu çıktı wc, sayıyı sağa hizaladığından önekli boşluk içerir .


3
Boşluk olmadan sadece satır sayısını elde etmek için: wc -l < foo.txt | xargsref - stackoverflow.com/a/12973694/149428
Taylor Edmiston

1
Bu nedenle, komut önde gelen boşluklarla bir cevap üretirken, soruyu soran kişi bir değişkene atıyordu ve bu, öndeki boşlukları otomatik olarak düşürüyor (en azından eski OSX bashındaki deneyimimdi). Başka bir deyişle, lines=`wc -l < $f`değerinde başında boşluk olmayan bir değişken "satır" ile sonuçlanır.
cycollins

Ya bul ile uğraşıyorsam? Bir hata alıyorum: iyi find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -lçalışıyor ancak her dosyayı yazdırıyor. Ben kullanırsanız find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l <bir hata alıyorum. parse error near '\n'
Nuno Gonçalves

55
wc $file | awk {'print "$4" "$2" "$1"'}

Düzeniniz için gerektiği gibi ayarlayın.

Negatif ("dizin değil") yerine pozitif mantık ("bir dosyadır") kullanmak daha güzel

[ -f $file ] && wc $file | awk {'print "$4" "$2" "$1"'}

1
Cmder'deki Windows'umda (bash 4.4.12) bu çalışır: wc $file | awk '{print $4" "$2" "$1}'- dışında kesme işaretleri {}.
Grzegorz Gierlik

36

Bazen wc farklı platformlarda farklı formatlarda çıktılar. Örneğin:

OS X'te:

$ echo aa | wc -l

         1

Centos'ta:

$ echo aa | wc -l

1

Bu nedenle, yalnızca kesme kullanmak numarayı almayabilir. Bunun yerine tr boşluk karakterlerini silmeyi deneyin:

$ echo aa | wc -l | tr -d ' '

23

Kabul / popüler cevaplar yapmak değil OSX üzerinde çalışmaya.

Aşağıdakilerden herhangi biri bsd ve linux üzerinde taşınabilir olmalıdır.

wc -l < "$f" | tr -d ' '

VEYA

wc -l "$f" | tr -s ' ' | cut -d ' ' -f 2

VEYA

wc -l "$f" | awk '{print $1}'

11

Dosya wcadını buna yeniden yönlendirirseniz, çıktıda dosya adını atlar.

Bash:

read lines words characters <<< $(wc < filename)

veya

read lines words characters <<EOF
$(wc < filename)
EOF

forÇıktısını yinelemek için kullanmak yerine şunu yapın ls:

for f in *

boşluk içeren dosya adları varsa işe yarayacaktır.

Globbing kullanamıyorsanız, bir while readdöngüye girmelisiniz :

find ... | while read -r f

veya işlem ikamesi kullanın

while read -r f
do
    something
done < <(find ...)

Yine de size oy verdim, ancak dosya adını yeniden yönlendirmenize gerek yok. Sadece ek alan olarak yakalayın. read lines words characters filename <<< $(wc "$f")Oh, ve eğer boşluklara karşı sertleşmek için * kullandıysanız, aynı zamanda, onu kullandığınızda var olanı çift tırnak içine almak istersiniz.
Bruno Bronosky

Ek bir değişken kullanmak gerçekten de bunu yapmanın başka bir yoludur, ancak değişkeni kullanmayacaksanız (belki de dosya adı bir değişkende vardır - $fbu durumda), gereksizdir. Ayrıca, OP nasıl istedi sadece tamsayı. Bir değişkenden alıntı yapma konusunda haklısınız, ancak değişkenin kullanımını göstermedim, bu yüzden bu noktadan bahsetmeyi ihmal ettim. for f in *Form hemen her zaman yerine çıkışın kullanım kullanılmalıdır lsbildiğiniz gibi.
sonraki duyuruya kadar duraklatıldı.

Bu lsnoktaya tamamen katılıyorum . Bu sana bir ödül kazandıracak. partmaps.org/era/unix/award.html#ls
Bruno Bronosky

Dosya read lines words characters _ <<< $(wc "$f")

@EvanTeitelman: Yukarıdaki yorumlarınızdan birkaçında tartışıldığı gibi. $_sadece farklı bir değişkendir.
sonraki duyuruya kadar duraklatıldı.

3

Dosya küçükse wc, iki kez aramayı karşılayabilir ve aşağıdaki gibi bir şey kullanabilirsiniz, bu da fazladan bir işleme borudan kaçınmanızı sağlar:

lines=$((`wc -l "$f"`))
words=$((`wc -w "$f"`))

$((...))Olan aritmetik Bash. wcBu durumda çıktısından herhangi bir beyaz boşluğu kaldırır .

Eğer gerekirse bu çözüm daha mantıklı ya linecount veya wordcount.


2

Nasıl olur sed?

wc -l /path/to/file.ext | sed 's/ *\([0-9]* \).*/\1/'


1

Bunu sayısal sonuç için deneyin:
nlines = $ (wc -l <$ dosyam)


0

Bunu dene:

wc `ls` | awk '{ LINE += $1; WC += $2 } END { print "lines: " LINE  " words: " WC }'

Satır sayısı ve kelime sayısı (SATIR ve WC) oluşturur ve bunları wc'den çıkarılan değerlerle arttırır (ilk sütunun değeri için $ 1, ikincisi için $ 2 kullanarak) ve son olarak sonuçları yazdırır.


0

"Temel olarak satır numaralarını ve kelime sayılarını ekrana dosya adından sonra yazmak istiyorum."

answer=(`wc $f`)
echo -e"${answer[3]}
lines:  ${answer[0]}
words:  ${answer[1]}
bytes:  ${answer[2]}"

Çıktılar: dosyam.txt satırları: 10 kelime: 20 bayt: 120


0
files=`ls`
echo "$files" | wc -l | perl -pe "s#^\s+##"

perlYine de kullanıyorsanız , kelime sayımını Perl'de de yapabilirsiniz. Daha ekonomik bir yaklaşım boruya olacaktırtr -d '[:space:]'
tripleee
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.