Dies ist eine Frage, die ich jetzt zweimal nachgeschlagen habe. Dieses Verhalten von wc ist nicht intuitiv und antiparadigmatisch für die übliche Knappheit. Diese Knappheit gibt es aus einem Grund, weil Sie genau nicht alle Arten von flauschiger Redundanz umgehen wollen. Immerhin kenne ich den Dateinamen, nicht wahr? Was ich will, ist die Zeilenanzahl.
In AIX, ksh, steht vor der Nummer immer ein Leerzeichen. Wir müssen | verwenden awk '{print $ 1}' oder ein Schnitt, um die Leerzeichen abzuschneiden. Eine andere Möglichkeit zum Trimmen wäre, ein Echo einzuschließen.
Rao
@rao ist korrekt, dies fügt ein Leerzeichen vor der Nummer hinzu. Meine Lösung löst dies und ist einfacher als awk oder cut.
Desi Cochrane
@rao Es gibt keinen Platz mit Bash. Woher kommt der Raum in ksh? wc -lsollte keine ausgeben, und warum sollte ksh der Standardausgabe eines Programms ein Leerzeichen voranstellen?
Peter - Monica
Dies ist zwar die richtige Problemumgehung (und es ist einfach genug, dass wc nie geändert wurde), aber wahrscheinlich langsamer und nicht intuitiv. Zum einen würde ich so etwas wie 4711 [stdin]die Ausgabe erwarten .
Peter - Reinstate Monica
Erwägen Sie auch das Pairing mit printf "%'d", wodurch der Platz geschont und große Zahlen schön ausgedruckt werden.
Leo
21
cat file.txt | wc -l
Laut Manpage (für die BSD-Version muss ich keine GNU-Version überprüfen):
Wenn keine Dateien angegeben sind, wird die Standardeingabe verwendet und kein Dateiname angezeigt. Die Eingabeaufforderung akzeptiert Eingaben bis zum Empfang von EOF oder [^ D] in den meisten Umgebungen.
Ich mag keine Katze - die Verkettung nimmt zu viel Zeit in Anspruch.
PoGibas
9
wc -l < file.txthat den gleichen Effekt.
pjmorse
@user: Teste es. Der mit Abstand langsamste Teil ist das Lesen der Datei von der Festplatte.
Sarnold
11
@ user1286528 dann verwenden wc -l < file.txt, um die nutzlose Verwendung von Katze zu vermeiden. Obwohl Sie absolut verrückt sind, wenn Sie denken, dass dies spürbare Zeit in Anspruch nimmt.
Hobbs
12
Um dies ohne den führenden Raum zu tun, warum nicht:
Das ist nicht besser als das wc -l file.txt | awk '{print $1}'OP versucht hat.
DoubleDown
1
Schneller als die wc -l < file.txtMethode. Muss aber | cut -d' ' -f2auf BSD verwendet werden, solange der wcBefehl ein führendes Leerzeichen zurückgibt, Beispiel: "34068289 file.txt" anstelle von "34068289 file.txt".
Sopalajo de Arrierez
@doubleDown Nun, die Verwendung von awk ist wie die Verwendung einer CNC-Maschine zum Schneiden einer Platte anstelle einer Säge. Verwenden Sie zum Sägen eine Säge.
Peter - Stellen Sie Monica
5
Vergleich der Techniken
Ich hatte ein ähnliches Problem beim Versuch, eine Zeichenanzahl ohne das von bereitgestellte führende Leerzeichen zu erhalten wc, was mich zu dieser Seite führte. Nachdem ich die Antworten hier ausprobiert habe, sind die folgenden Ergebnisse meiner persönlichen Tests auf einem Mac (BSD Bash). Auch dies ist für die Anzahl der Zeichen; für die Zeilenanzahl würden Sie tun wc -l. echo -nlässt den Zeilenumbruch weg.
Ich würde mich cut -f*im Allgemeinen nicht auf die Methode verlassen, da Sie die genaue Anzahl der führenden Leerzeichen für eine bestimmte Ausgabe kennen müssen. Und der grepeine dient zum Zählen von Zeilen, aber nicht von Zeichen.
bcist am prägnantesten awkund perlscheint ein bisschen übertrieben, aber sie sollten alle relativ schnell und tragbar genug sein.
Beachten Sie auch, dass einige davon angepasst werden können, um umgebende Leerzeichen auch von allgemeinen Zeichenfolgen zu trennen (zusammen mit echo `echo $FOO`einem weiteren netten Trick).
@tripleee Whoa ... verhält sich basierend auf Ihrem Code echo `echo $FOO`;auch wie ein String.trim () -Befehl für eine Variable! Das ist unglaublich praktisch. Ich werde auch Ihre Zeile zu meiner Antwort hinzufügen.
Nett. Sehr originelle / kreative Verwendung, grepaber wenn ich dies überprüfe, stellt sich heraus (nicht überraschend), dass es 2x bis 6x langsamer ist als die einfachere / unkomplizierte wcMethode in meinen Tests.
Arielf
3
Offensichtlich gibt es dafür viele Lösungen. Hier ist noch eine:
Dies gibt nur die Anzahl der Zeilen aus, aber das nachfolgende Zeilenumbruchzeichen ( \n) ist vorhanden. Wenn Sie dies auch nicht möchten, ersetzen Sie es [:blank:]durch [:space:].
wc -l < file.txt
erledigt die Arbeit präzise und präzise.Antworten:
Versuchen Sie Folgendes:
quelle
wc -l
sollte keine ausgeben, und warum sollte ksh der Standardausgabe eines Programms ein Leerzeichen voranstellen?4711 [stdin]
die Ausgabe erwarten .printf "%'d"
, wodurch der Platz geschont und große Zahlen schön ausgedruckt werden.Laut Manpage (für die BSD-Version muss ich keine GNU-Version überprüfen):
quelle
wc -l < file.txt
hat den gleichen Effekt.wc -l < file.txt
, um die nutzlose Verwendung von Katze zu vermeiden. Obwohl Sie absolut verrückt sind, wenn Sie denken, dass dies spürbare Zeit in Anspruch nimmt.Um dies ohne den führenden Raum zu tun, warum nicht:
quelle
wc -l < file.txt
, um denwc -l < file.txt | bc
Wie wäre es mit
dh die Ausgabe von
wc
incut
weiterleiten (wobei Trennzeichen Leerzeichen sind und nur das erste Feld auswählen)quelle
wc -l file.txt | awk '{print $1}'
OP versucht hat.wc -l < file.txt
Methode. Muss aber| cut -d' ' -f2
auf BSD verwendet werden, solange derwc
Befehl ein führendes Leerzeichen zurückgibt, Beispiel: "34068289 file.txt" anstelle von "34068289 file.txt".Vergleich der Techniken
Ich hatte ein ähnliches Problem beim Versuch, eine Zeichenanzahl ohne das von bereitgestellte führende Leerzeichen zu erhalten
wc
, was mich zu dieser Seite führte. Nachdem ich die Antworten hier ausprobiert habe, sind die folgenden Ergebnisse meiner persönlichen Tests auf einem Mac (BSD Bash). Auch dies ist für die Anzahl der Zeichen; für die Zeilenanzahl würden Sie tunwc -l
.echo -n
lässt den Zeilenumbruch weg.Ich würde mich
cut -f*
im Allgemeinen nicht auf die Methode verlassen, da Sie die genaue Anzahl der führenden Leerzeichen für eine bestimmte Ausgabe kennen müssen. Und dergrep
eine dient zum Zählen von Zeilen, aber nicht von Zeichen.bc
ist am prägnantestenawk
undperl
scheint ein bisschen übertrieben, aber sie sollten alle relativ schnell und tragbar genug sein.Beachten Sie auch, dass einige davon angepasst werden können, um umgebende Leerzeichen auch von allgemeinen Zeichenfolgen zu trennen (zusammen mit
echo `echo $FOO`
einem weiteren netten Trick).quelle
echo $(printf '%s' "$FOO" | wc -c)
ist eine der seltenenecho
Situationen, in denen mit einem Befehl Subshitution nicht nutzlos ist.echo `echo $FOO`;
auch wie ein String.trim () -Befehl für eine Variable! Das ist unglaublich praktisch. Ich werde auch Ihre Zeile zu meiner Antwort hinzufügen.printf
besser alsecho
?Wie wäre es mit
quelle
grep
aber wenn ich dies überprüfe, stellt sich heraus (nicht überraschend), dass es 2x bis 6x langsamer ist als die einfachere / unkompliziertewc
Methode in meinen Tests.Offensichtlich gibt es dafür viele Lösungen. Hier ist noch eine:
wc -l somefile | tr -d "[:alpha:][:blank:][:punct:]"
Dies gibt nur die Anzahl der Zeilen aus, aber das nachfolgende Zeilenumbruchzeichen (
\n
) ist vorhanden. Wenn Sie dies auch nicht möchten, ersetzen Sie es[:blank:]
durch[:space:]
.quelle
test9
mit 1 Zeile wird die Ausgabe 19 sein.Der beste Weg wäre, zuerst alle Dateien im Verzeichnis zu finden und dann AWK NR (Number of Records Variable) zu verwenden.
unten ist der Befehl:
Beispiel: -
find /tmp/ -type f | awk 'END{print NR}'
quelle
Dies funktioniert bei mir mit dem Normalen
wc -l
undsed
um jedes Zeichen zu entfernen, das keine Zahl ist.quelle