wc -l file.txt
génère le nombre de lignes et le nom du fichier.
J'ai juste besoin du numéro lui-même (pas du nom du fichier).
je peux le faire
wc -l file.txt | awk '{print $1}'
Mais peut-être existe-t-il un meilleur moyen?
wc -l file.txt
génère le nombre de lignes et le nom du fichier.
J'ai juste besoin du numéro lui-même (pas du nom du fichier).
je peux le faire
wc -l file.txt | awk '{print $1}'
Mais peut-être existe-t-il un meilleur moyen?
Réponses:
Essayez de cette façon:
wc -l < file.txt
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.
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.
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:
wc -l < file.txt | bc
wc -l < file.txt
pour corriger l'erreur d'analyse et supprimer l'espace:wc -l < file.txt | bc
Que diriez-vous
wc -l file.txt | cut -d' ' -f1
c'est-à-dire diriger la sortie de wc
into cut
(où les délimiteurs sont des espaces et ne sélectionner que le premier champ)
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 la wc
commande renvoie un espace de début, exemple: "34068289 file.txt", au lieu de "34068289 file.txt".
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 -n
omet le saut de ligne de fin.
FOO="bar"
echo -n "$FOO" | wc -c # " 3" (x)
echo -n "$FOO" | wc -c | bc # "3" (√)
echo -n "$FOO" | wc -c | tr -d ' ' # "3" (√)
echo -n "$FOO" | wc -c | awk '{print $1}' # "3" (√)
echo -n "$FOO" | wc -c | cut -d ' ' -f1 # "" for -f < 8 (x)
echo -n "$FOO" | wc -c | cut -d ' ' -f8 # "3" (√)
echo -n "$FOO" | wc -c | perl -pe 's/^\s+//' # "3" (√)
echo -n "$FOO" | wc -c | grep -ch '^' # "1" (x)
echo $( printf '%s' "$FOO" | wc -c ) # "3" (√)
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 grep
celui fonctionne pour compter les lignes, mais pas les caractères.
bc
est le plus concis awk
et perl
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).
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 que echo
?
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:]
.
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:
find <directory path> -type f | awk 'END{print NR}'
exemple : - find /tmp/ -type f | awk 'END{print NR}'
wc -l < file.txt
fait le travail avec précision et concision.