Holen Sie sich nur die Ganzzahl von WC in Bash

115

Gibt es eine Möglichkeit, die Ganzzahl zu erhalten, die wc in bash zurückgibt?

Grundsätzlich möchte ich die Zeilennummern und Wortzahlen nach dem Dateinamen auf den Bildschirm schreiben.

output: filename linecount wordcount Folgendes habe ich bisher:

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

Jordanien
quelle

Antworten:

57

Mit dem cutBefehl können Sie nur das erste Wort der wcAusgabe abrufen (dh die Zeilen- oder Wortzahl):

lines=`wc -l $f | cut -f1 -d' '`
words=`wc -w $f | cut -f1 -d' '`
casablanca
quelle
5
Das zweimalige Ausführen von wc für dieselbe Datei ist ineffizient.
Gawi
3
Das stimmt, deshalb denke ich, dass James Broadheads Antwort viel besser ist. Ich konnte nicht cutmit der vollständigen Ausgabe von arbeiten, wc $fda die Anzahl der Leerzeichen zwischen den Feldern variiert.
Casablanca
1
@casablanca Sie können die Anzahl der Leerzeichen mit 'tr -s' drücken. Ich habe in meiner Antwort unten weitere tragbare Lösungen für diese Frage aufgeführt.
Rubel
Da wir in dieser Antwort einer Variablen zuweisen, könnten wir die Leerzeichen mit
Cycollins
88

Die einfachste Antwort aller Zeiten:

wc < filename 
BananaNeil
quelle
5
Erzeugt aber nicht die gewünschte Ausgabe.
Dave Newton
Sicher, Sie geben einfach die richtigen Parameter ein, die Sie sowieso würden. Wenn Sie dies beispielsweise tun wc -c < file name, erhalten Sie nur die ganzzahlige Anzahl von Bytes und sonst nichts.
BananaNeil
13
Mein Punkt war, dass, wenn Sie eine (1,5 Jahre alte) Frage beantworten wollen, genauso gut alle Informationen in die Antwort einfließen könnten, das ist alles :)
Dave Newton
whoops, lies die Frage einfach noch einmal durch. #fail, ich habe nachgeforscht, wie man nur die ganzen Zahlen erhält , und ich habe Informationen aus einer der Antworten verwendet, als ich eine bessere Antwort gefunden habe, und dann beschlossen, darüber zu posten. Entschuldigung ..
BananaNeil
3
Sie haben Google geantwortet, darauf kommt es an. :-)
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功
82

Gerade:

wc -l < file_name

wird den Job machen. Diese Ausgabe enthält jedoch Leerzeichen mit Präfix, da wcdie Zahl rechtsbündig ausgerichtet ist.

sten
quelle
3
Um nur die Zeilenanzahl ohne Leerzeichen zu erhalten: wc -l < foo.txt | xargsref - stackoverflow.com/a/12973694/149428
Taylor Edmiston
1
Während der Befehl eine Antwort mit führenden Leerzeichen erzeugt, hat der Fragesteller eine Variable zugewiesen, die die führenden Leerzeichen automatisch löscht (zumindest war dies meine Erfahrung mit der älteren OSX-Bash). Mit anderen Worten, es lines=`wc -l < $f`entsteht eine Variable "line", deren Wert keine führenden Leerzeichen enthält.
Cycollins
Was ist, wenn ich mit find pfeife? Ich erhalte eine Fehlermeldung: find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -lfunktioniert einwandfrei, druckt aber jede Datei. Wenn ich benutze, find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l <erhalte ich eine Fehlermeldung. parse error near '\n'
Nuno Gonçalves
55
wc $file | awk {'print "$4" "$2" "$1"'}

Passen Sie sie nach Bedarf an Ihr Layout an.

Es ist auch schöner, positive Logik ("ist eine Datei") gegenüber negativer ("kein Verzeichnis") zu verwenden.

[ -f $file ] && wc $file | awk {'print "$4" "$2" "$1"'}
James Broadhead
quelle
1
Unter meinem Windows in Cmder (Bash 4.4.12) funktioniert dies: wc $file | awk '{print $4" "$2" "$1}'- Apostrophe außerhalb von {}.
Grzegorz Gierlik
36

Manchmal gibt wc in verschiedenen Formaten auf verschiedenen Plattformen aus. Beispielsweise:

In OS X:

$ echo aa | wc -l

         1

In Centos:

$ echo aa | wc -l

1

Wenn Sie also nur cut verwenden, wird die Nummer möglicherweise nicht abgerufen. Versuchen Sie stattdessen tr, Leerzeichen zu löschen:

$ echo aa | wc -l | tr -d ' '
Tahsin Turkoz
quelle
23

Die akzeptierten / populäre Antworten tun nicht Arbeit auf OSX.

Alle folgenden Funktionen sollten unter bsd und Linux portierbar sein.

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

ODER

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

ODER

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

Wenn Sie den Dateinamen in wcdiesen umleiten, wird der Dateiname bei der Ausgabe weggelassen.

Bash:

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

oder

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

forGehen Sie folgendermaßen vor, anstatt die Ausgabe von zu durchlaufen ls:

for f in *

Dies funktioniert, wenn es Dateinamen gibt, die Leerzeichen enthalten.

Wenn Sie Globbing nicht verwenden können, sollten Sie eine while readSchleife erstellen :

find ... | while read -r f

oder Prozesssubstitution verwenden

while read -r f
do
    something
done < <(find ...)
Bis auf weiteres angehalten.
quelle
Ich habe Sie trotzdem positiv bewertet, aber Sie müssen den Dateinamen nicht umleiten. Erfassen Sie es einfach als zusätzliches Feld. read lines words characters filename <<< $(wc "$f")Oh, und wenn Sie * gegen Leerzeichen gehärtet haben, möchten Sie die Var auch doppelt zitieren, wenn Sie sie verwenden.
Bruno Bronosky
Die Verwendung einer zusätzlichen Variablen ist in der Tat eine andere Möglichkeit, aber wenn Sie die Variable nicht verwenden möchten (möglicherweise haben Sie den Dateinamen bereits in einer Variablen - $fin diesem Fall), ist dies nicht erforderlich. Außerdem fragte das OP, wie man nur die ganze Zahl erhält . Sie haben Recht, eine Variable zu zitieren, aber ich habe die Verwendung der Variablen nicht gezeigt, daher habe ich diesen Punkt nicht erwähnt. Wie Sie wissen, for f in *sollte das Formular fast immer verwendet werden, anstatt die Ausgabe von zu verwenden ls.
Bis auf weiteres angehalten.
In diesem lsPunkt stimme ich voll und ganz zu . Das bringt dir eine Auszeichnung. partmaps.org/era/unix/award.html#ls
Bruno Bronosky
Wenn Sie den Dateinamen nicht möchten, können Sie dies tun:read lines words characters _ <<< $(wc "$f")
@EvanTeitelman: Wie in einigen der obigen Kommentare besprochen. $_ist nur eine andere Variable.
Bis auf weiteres angehalten.
3

Wenn die Datei klein ist, können Sie es sich leisten, wczweimal aufzurufen und Folgendes zu verwenden, um das Weiterleiten an einen zusätzlichen Prozess zu vermeiden:

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

Das $((...))ist die arithmetische Erweiterung von Bash. wcIn diesem Fall werden alle Leerzeichen aus der Ausgabe von entfernt .

Diese Lösung ist sinnvoller, wenn Sie entweder die Zeilenanzahl oder die Wortanzahl benötigen.

Walter Tross
quelle
2

Wie wäre es mit sed?

wc -l /path/to/file.ext | sed 's/ *\([0-9]* \).*/\1/'
mgold
quelle
1
typeset -i a=$(wc -l fileName.dat  | xargs echo | cut -d' ' -f1)
GeorgesMakarios
quelle
1

Versuchen Sie dies für ein numerisches Ergebnis:
nlines = $ (wc -l <$ myfile)

Paulonki
quelle
0

Versuche dies:

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

Es erstellt eine Zeilen- und Wortanzahl (LINE und WC) und erhöht diese mit den aus wc extrahierten Werten (wobei $ 1 für den Wert der ersten Spalte und $ 2 für den zweiten verwendet wird) und druckt schließlich die Ergebnisse.

Aif
quelle
0

"Grundsätzlich möchte ich die Zeilennummern und Wortzahlen nach dem Dateinamen auf den Bildschirm schreiben."

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

Ausgaben: myfile.txt Zeilen: 10 Wörter: 20 Bytes: 120

user8155253
quelle
0
files=`ls`
echo "$files" | wc -l | perl -pe "s#^\s+##"
Pedro Reis
quelle
Wenn Sie es perltrotzdem verwenden, können Sie die Wortzählung auch in Perl durchführen. Ein wirtschaftlicherer Ansatz wäre, zutr -d '[:space:]'
Tripleee