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
94
demandé sur Jordan 2010-09-19 22:33:46

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' '`
45
répondu casablanca 2010-09-20 01:31:19

Réponse la plus simple jamais:

wc < filename 
73
répondu BananaNeil 2012-01-29 13:31:33

Juste:

wc -l < file_name

Fera le travail

61
répondu user1019129 2013-06-28 14:52:39
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"'}
53
répondu James Broadhead 2017-08-28 09:28:34

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 ' '
28
répondu Tahsin Turkoz 2016-11-23 19:53:59

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}'
13
répondu rouble 2016-01-28 21:51:06

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 ...)
10
répondu Dennis Williamson 2010-09-19 22:27:42

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.

2
répondu Walter Tross 2015-06-25 22:02:11
typeset -i a=$(wc -l fileName.dat  | xargs echo | cut -d' ' -f1)
1
répondu GeorgesMakarios 2012-07-04 21:03:12

Que diriez-vous avec sed?

wc -l /path/to/file.ext | sed 's/ *\([0-9]* \).*/\1/'
1
répondu mgold 2012-12-28 03:44:46

Essayez ceci pour le résultat numérique:
nlines=$( wc-l

1
répondu paulonki 2013-06-28 14:20:11
files=`ls`
echo "$files" | wc -l | perl -pe "s#^\s+##"
1
répondu Pedro Reis 2017-11-13 14:25:13

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.

0
répondu Aif 2010-09-19 18:43:32

"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

0
répondu user8155253 2017-06-13 14:25:57

Une autre façon, similaire à ce que @ BananaNeil a posté:

$ cat myfile.txt | wc -l
-1
répondu Sergei Basharov 2017-03-21 12:18:32