Existe-t-il un moyen d’obtenir le nombre entier renvoyé par wc dans bash?
En gros, 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 jusqu'ici:
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
Vous pouvez utiliser la commande cut
pour obtenir uniquement le premier mot de la sortie de wc
(qui correspond à la ligne ou au nombre de mots):
lines=`wc -l $f | cut -f1 -d' '`
words=`wc -w $f | cut -f1 -d' '`
Réponse la plus simple jamais:
wc < filename
Juste:
wc -l < file_name
va faire le travail. Mais cette sortie inclut les espaces blancs préfixés tels que wc
aligne le nombre à droite.
wc $file | awk {'print "$4" "$2" "$1"'}
Ajustez si nécessaire pour votre mise en page.
Il est également préférable d'utiliser une logique positive ("est un fichier") plutôt que négative ("pas un répertoire").
[ -f $file ] && wc $file | awk {'print "$4" "$2" "$1"'}
Parfois, wc affiche des formats différents sur des plates-formes différentes. Par exemple:
Sous OS X:
$ echo aa | wc -l
1
En centos:
$ echo aa | wc -l
1
Donc, utiliser seulement couper peut ne pas récupérer le nombre. Au lieu de cela, essayez de supprimer les espaces:
$ echo aa | wc -l | tr -d ' '
Les réponses acceptées/populaires ne fonctionnent pas pas sur OSX.
N'importe lequel des éléments suivants devrait être portable sur bsd et linux.
wc -l < "$f" | tr -d ' '
OR
wc -l "$f" | tr -s ' ' | cut -d ' ' -f 2
OR
wc -l "$f" | awk '{print $1}'
Si vous redirigez le nom de fichier dans wc
, le nom de fichier est omis en sortie.
Frapper:
read lines words characters <<< $(wc < filename)
ou
read lines words characters <<EOF
$(wc < filename)
EOF
Au lieu d'utiliser for
pour parcourir le résultat de ls
, procédez comme suit:
for f in *
ce qui fonctionnera s’il existe des noms de fichiers contenant des espaces.
Si vous ne pouvez pas utiliser globbing, vous devriez 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 reprises et utilisez l'une des méthodes suivantes, qui évite la création d'un processus supplémentaire:
lines=$((`wc -l "$f"`))
words=$((`wc -w "$f"`))
$((...))
est le Arithmetic Expansion de bash. Il supprime tous les espaces de la sortie de wc
dans ce cas.
Cette solution a plus de sens si vous avez besoin de soit le nombre de lignes ou le nombre de mots.
Essayez ceci pour un résultat numérique:
nlines = $ (wc -l <$ myfile)
Que diriez-vous de sed
?
wc -l /path/to/file.ext | sed 's/ *\([0-9]* \).*/\1/'
files=`ls`
echo "$files" | wc -l | Perl -pe "s#^\s+##"
"En gros, je veux écrire les numéros de ligne et le nombre de mots à l'écran après le nom du fichier."
answer=(`wc $f`)
echo -e"${answer[3]}
lines: ${answer[0]}
words: ${answer[1]}
bytes: ${answer[2]}"
Les sorties : monfichier.txt lignes: 10 mots: 20 octets: 120
typeset -i a=$(wc -l fileName.dat | xargs echo | cut -d' ' -f1)
Essaye ça:
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 (LINE 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 affiche finalement les résultats.