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.