C'est une question que j'ai regardée deux fois maintenant. Ce comportement de wc est peu intuitif et anti-paradigmatique pour la concision habituelle de -nix. Cette lacune est là pour une raison, car vous ne voulez exactement pas contourner toutes sortes de redondances moelleuses. Après tout, je connais le nom du fichier, n'est-ce pas? Ce que je veux, c'est le nombre de lignes.
Sous AIX, ksh, il y aura toujours un espace précédant le nombre. Nous devons utiliser | awk '{print $ 1}' ou une coupe, pour couper les espaces. Une autre façon de couper serait de fermer avec un écho.
rao
@rao est correct, cela ajoutera un espace avant le nombre. Ma solution résout ce problème et est plus simple que awk ou cut.
Desi Cochrane
@rao Il n'y a pas d'espace avec bash. D'où vient l'espace dans ksh? wc -lne devrait pas en émettre un, et pourquoi ksh ajouterait-il un espace à la sortie standard d'un programme?
Peter - Réintègre Monica le
Bien que ce soit la bonne solution de contournement (et il est assez facile que wc n'ait jamais été modifié), elle est probablement plus lente et peu intuitive. D'une part, je m'attendrais à quelque chose comme 4711 [stdin]la sortie.
Peter - Réintègre Monica
Pensez également à l'appairer avec printf "%'d", qui prend soin de l'espace et imprime bien les grands nombres.
Leo
21
cat file.txt | wc -l
D'après la page de manuel (pour la version BSD, je n'ai pas de version GNU à vérifier):
Si aucun fichier n'est spécifié, l'entrée standard est utilisée et aucun nom de fichier n'est affiché. L'invite acceptera l'entrée jusqu'à la réception d'EOF, ou [^ D] dans la plupart des environnements.
Je n'aime pas les chats - la concaténation prend trop de temps.
PoGibas
9
wc -l < file.txta le même effet.
pjmorse
@user: Testez-le. De loin, la partie la plus lente sera de lire le fichier sur le disque.
sarnold
11
@ user1286528 puis utilisez wc -l < file.txtpour éviter l'utilisation inutile de cat. Bien que vous soyez absolument fou si vous pensez que cela prend un temps notable.
hobbs
12
Pour ce faire sans l'espace de tête, pourquoi pas:
J'obtiens des erreurs de syntaxe avec ceci (Ubuntu 14.04). Je pense qu'il y a un problème avec le nom de fichier.
MERose
Sur un RHEL 6.7, il génère des erreurs: $ wc -l fichier.csv | bc (standard_in) 1: erreur de syntaxe (standard_in) 1: caractère illégal: N (standard_in) 1: erreur de syntaxe (standard_in) 1: erreur de syntaxe
Rodrigo Hjort
3
J'obtiens également une erreur d'analyse, mais vous pouvez combiner cela avec l'autre réponse à utiliser wc -l < file.txtpour corriger l'erreur d'analyse et supprimer l'espace:wc -l < file.txt | bc
jangosteve
11
Que diriez-vous
wc -l file.txt | cut -d' '-f1
c'est-à-dire diriger la sortie de wcinto cut(où les délimiteurs sont des espaces et ne sélectionner que le premier champ)
ce n'est pas mieux que l' wc -l file.txt | awk '{print $1}'OP essayé.
doubleDown
1
Plus rapide que la wc -l < file.txtméthode. Mais doit utiliser | cut -d' ' -f2sur BSD, tant que la wccommande renvoie un espace de début, exemple: "34068289 file.txt", au lieu de "34068289 file.txt".
Sopalajo de Arrierez
@doubleDown Eh bien, utiliser awk, c'est comme utiliser une machine CNC pour couper une planche au lieu d'une scie. Utilisez une scie pour scier.
Peter - Réintègre Monica
5
Comparaison des techniques
J'ai eu un problème similaire en essayant d'obtenir un nombre de caractères sans le premier espace blanc fourni par wc, ce qui m'a conduit à cette page. Après avoir essayé les réponses ici, voici les résultats de mes tests personnels sur Mac (BSD Bash). Encore une fois, c'est pour le nombre de caractères; pour le nombre de lignes que vous feriez wc -l. echo -nomet le saut de ligne de fin.
Je ne me fierais pas à la cut -f*méthode en général, car elle nécessite que vous connaissiez le nombre exact d'espaces de début qu'une sortie donnée peut avoir. Et grepcelui fonctionne pour compter les lignes, mais pas les caractères.
bcest le plus concis awket perlsemble un peu exagéré, mais ils devraient tous être assez rapides et suffisamment portables.
Notez également que certains d'entre eux peuvent également être adaptés pour couper les espaces blancs environnants à partir de chaînes générales (avec echo `echo $FOO`une autre astuce intéressante).
@tripleee Whoa ... basé sur votre code, echo `echo $FOO`;agit également comme une commande String.trim () sur une variable! C'est incroyablement pratique. J'ajouterai également votre ligne à ma réponse.
Agréable. Utilisation très originale / créative de grepmais en vérifiant cela, il s'avère (sans surprise) être 2x à 6x plus lent que la wcméthode la plus simple / directe de mes tests.
arielf
3
De toute évidence, il existe de nombreuses solutions à cela. En voici un autre cependant:
Cela ne produit que le nombre de lignes, mais le caractère de fin de ligne ( \n) est présent, si vous ne le souhaitez pas non plus, remplacez-le [:blank:]par [:space:].
wc -l < file.txt
fait le travail avec précision et concision.Réponses:
Essayez de cette façon:
la source
wc -l
ne devrait pas en émettre un, et pourquoi ksh ajouterait-il un espace à la sortie standard d'un programme?4711 [stdin]
la sortie.printf "%'d"
, qui prend soin de l'espace et imprime bien les grands nombres.D'après la page de manuel (pour la version BSD, je n'ai pas de version GNU à vérifier):
la source
wc -l < file.txt
a le même effet.wc -l < file.txt
pour éviter l'utilisation inutile de cat. Bien que vous soyez absolument fou si vous pensez que cela prend un temps notable.Pour ce faire sans l'espace de tête, pourquoi pas:
la source
wc -l < file.txt
pour corriger l'erreur d'analyse et supprimer l'espace:wc -l < file.txt | bc
Que diriez-vous
c'est-à-dire diriger la sortie de
wc
intocut
(où les délimiteurs sont des espaces et ne sélectionner que le premier champ)la source
wc -l file.txt | awk '{print $1}'
OP essayé.wc -l < file.txt
méthode. Mais doit utiliser| cut -d' ' -f2
sur BSD, tant que lawc
commande renvoie un espace de début, exemple: "34068289 file.txt", au lieu de "34068289 file.txt".Comparaison des techniques
J'ai eu un problème similaire en essayant d'obtenir un nombre de caractères sans le premier espace blanc fourni par
wc
, ce qui m'a conduit à cette page. Après avoir essayé les réponses ici, voici les résultats de mes tests personnels sur Mac (BSD Bash). Encore une fois, c'est pour le nombre de caractères; pour le nombre de lignes que vous feriezwc -l
.echo -n
omet le saut de ligne de fin.Je ne me fierais pas à la
cut -f*
méthode en général, car elle nécessite que vous connaissiez le nombre exact d'espaces de début qu'une sortie donnée peut avoir. Etgrep
celui fonctionne pour compter les lignes, mais pas les caractères.bc
est le plus concisawk
etperl
semble un peu exagéré, mais ils devraient tous être assez rapides et suffisamment portables.Notez également que certains d'entre eux peuvent également être adaptés pour couper les espaces blancs environnants à partir de chaînes générales (avec
echo `echo $FOO`
une autre astuce intéressante).la source
echo $(printf '%s' "$FOO" | wc -c)
est l'une des rares occasions oùecho
avec une commande la subshitution n'est pas inutile.echo `echo $FOO`;
agit également comme une commande String.trim () sur une variable! C'est incroyablement pratique. J'ajouterai également votre ligne à ma réponse.printf
mieux queecho
?Que diriez-vous
la source
grep
mais en vérifiant cela, il s'avère (sans surprise) être 2x à 6x plus lent que lawc
méthode la plus simple / directe de mes tests.De toute évidence, il existe de nombreuses solutions à cela. En voici un autre cependant:
wc -l somefile | tr -d "[:alpha:][:blank:][:punct:]"
Cela ne produit que le nombre de lignes, mais le caractère de fin de ligne (
\n
) est présent, si vous ne le souhaitez pas non plus, remplacez-le[:blank:]
par[:space:]
.la source
test9
avec 1 ligne, le résultat sera 19.Le meilleur moyen serait tout d'abord de trouver tous les fichiers dans le répertoire, puis d'utiliser AWK NR (Variable du nombre d'enregistrements)
ci-dessous est la commande:
exemple : -
find /tmp/ -type f | awk 'END{print NR}'
la source
Cela fonctionne pour moi en utilisant la normale
wc -l
etsed
pour supprimer tout caractère qui n'est pas un nombre.la source