juste l'entier de wc dans bash
Existe-t-il un moyen d'obtenir l'entier que wc renvoie dans bash?
Fondamentalement, je veux écrire les numéros de ligne et le nombre de mots à l'écran après le nom du fichier.
output: filename linecount wordcount
Voici ce que j'ai à ce jour:
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
15 réponses
Vous pouvez utiliser le cut
commande pour obtenir juste le premier mot de la sortie de wc
(qui est le nombre de lignes ou de mots):
lines=`wc -l $f | cut -f1 -d' '`
words=`wc -w $f | cut -f1 -d' '`
wc $file | awk {'print "$4" "$2" "$1"'}
Ajustez au besoin votre mise en page.
Il est également plus agréable d'utiliser une logique positive ("est un fichier") sur négative ("pas un répertoire")
[ -f $file ] && wc $file | awk {'print "$4" "$2" "$1"'}
Parfois wc sorties dans différents formats dans différentes plates-formes. Par exemple:
Dans OS X:
$ echo aa | wc -l
1
En Centos:
$ echo aa | wc -l
1
Donc, en utilisant seulement cut peut ne pas récupérer le nombre. Essayez plutôt tr Pour supprimer les caractères d'espace:
$ echo aa | wc -l | tr -d ' '
Les réponses acceptées / populaires ne Pas fonctionnent sur OSX.
L'un des éléments suivants doit être portable sur bsd et linux.
wc -l < $f | tr -d ' '
Ou
wc -l $f | tr -s ' ' | cut -d ' ' -f 2
Ou
wc -l $f | awk '{print $1}'
Si vous redirigez le nom de fichier vers wc
, il omet le nom de fichier à la sortie.
Bash:
read lines words characters <<< $(wc < filename)
Ou
read lines words characters <<EOF
$(wc < filename)
EOF
Au lieu d'utiliser for
pour itérer sur la sortie de ls
, Faites ceci:
for f in *
Qui fonctionnera s'il y a des noms de fichiers qui incluent des espaces.
Si vous ne pouvez pas utiliser globbing, vous devriez vous diriger vers une boucle while read
:
find ... | while read -r f
Ou utiliser la substitution de processus
while read -r f
do
something
done < <(find ...)
Si le fichier est petit, vous pouvez vous permettre d'appeler wc
deux fois, et d'utiliser quelque chose comme ce qui suit, ce qui évite de créer un processus supplémentaire:
lines=$((`wc -l $f`))
words=$((`wc -w $f`))
Le $((...))
est le Expansion Arithmétique de bash. Il supprime tout espace de la sortie de wc
dans ce cas.
Cette solution a plus de sens si vous avez besoin d' , soit la linecount ou le nombre de mots.
typeset -i a=$(wc -l fileName.dat | xargs echo | cut -d' ' -f1)
Que diriez-vous avec sed
?
wc -l /path/to/file.ext | sed 's/ *\([0-9]* \).*/\1/'
Essayez ceci:
wc `ls` | awk '{ LINE += $1; WC += $2 } END { print "lines: " LINE " words: " WC }'
Il crée un nombre de lignes et un nombre de mots (ligne et WC), et les augmente avec les valeurs extraites de wc (en utilisant $1 pour la valeur de la première colonne et $2 pour la seconde) et imprime finalement les résultats.
"Fondamentalement, je veux écrire les numéros de ligne et le nombre de mots à l'écran après le nom de fichier."
answer=(`wc $f`)
echo -e"${answer[3]}
lines: ${answer[0]}
words: ${answer[1]}
bytes: ${answer[2]}"
Sorties : myfile.txt lignes: 10 mots: 20 octets: 120
Une autre façon, similaire à ce que @ BananaNeil a posté:
$ cat myfile.txt | wc -l