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 jusqu'à présent:
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
cut
travailler sur la sortie complète dewc $f
parce que le nombre d'espaces entre les champs varie.La réponse la plus simple qui soit:
la source
wc -c < file name
, cela ne vous donnera que le nombre entier d'octets et rien d'autre.Juste:
fera le travail. Mais cette sortie inclut des espaces blancs préfixés comme
wc
alignant à droite le nombre.la source
wc -l < foo.txt | xargs
ref - stackoverflow.com/a/12973694/149428lines=`wc -l < $f`
résulte une variable "ligne" dont la valeur n'a pas d'espaces de début.find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l
fonctionne bien mais imprime chaque fichier. Si j'utilise,find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l <
j'obtiens une erreur.parse error near '\n'
Ajustez si nécessaire pour votre mise en page.
Il est également plus agréable d'utiliser la logique positive ("est un fichier") plutôt que le négatif ("pas un répertoire")
la source
wc $file | awk '{print $4" "$2" "$1}'
- apostrophes en dehors de{}
.Parfois, wc sort dans différents formats sur différentes plates-formes. Par exemple:
Sous OS X:
En Centos:
Ainsi, n'utiliser que couper peut ne pas récupérer le numéro. Essayez plutôt de supprimer les caractères d'espacement:
la source
Les réponses acceptées / populaires ne fonctionnent pas sous OSX.
Tous les éléments suivants doivent être portables sur bsd et linux.
OU
OU
la source
Si vous redirigez le nom de fichier,
wc
il omet le nom de fichier à la sortie.Frapper:
ou
Au lieu d'utiliser
for
pour itérer sur la sortie dels
, faites ceci:qui fonctionnera s'il y a des noms de fichiers qui incluent des espaces.
Si vous ne pouvez pas utiliser de globulation, vous devez diriger dans une
while read
boucle:ou utilisez la substitution de processus
la source
read lines words characters filename <<< $(wc "$f")
Oh, et si vous étiez * pour être durci contre les espaces, vous voulez également double guillemet la var lorsque vous l'utilisez.$f
dans ce cas), ce n'est pas nécessaire. En outre, l'OP a demandé comment obtenir uniquement l'entier. Vous avez raison de citer une variable, mais je n'ai pas montré l'utilisation de la variable, j'ai donc omis de mentionner ce point. Lefor f in *
formulaire devrait presque toujours être utilisé au lieu d'utiliser la sortie dels
, comme vous le savez.ls
point. Cela vous rapportera un prix. partmaps.org/era/unix/award.html#lsread lines words characters _ <<< $(wc "$f")
$_
est juste une variable différente.Si le fichier est petit, vous pouvez vous permettre d'appeler
wc
deux fois et utiliser quelque chose comme ce qui suit, ce qui évite de passer à un processus supplémentaire:Le
$((...))
est l' expansion arithmétique de bash. Il supprime tous les espaces de la sortie dewc
dans ce cas.Cette solution est plus logique si vous avez besoin soit le linecount ou le wordcount.
la source
Et avec
sed
?la source
la source
Essayez ceci pour le résultat numérique:
nlines = $ (wc -l <$ myfile)
la source
Essaye ça:
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 imprime enfin les résultats.
la source
Sorties: myfile.txt lignes: 10 mots: 20 octets: 120
la source
la source
perl
quand même, autant faire le décompte des mots en Perl. Une approche plus économique serait de canaliser verstr -d '[:space:]'