web-dev-qa-db-fra.com

obtenir seulement l'entier de wc dans bash

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 wordcountVoici 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

98
Jordan

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' '`
47
casablanca

Réponse la plus simple jamais:

wc < filename 
80
BananaNeil

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.

73
sten
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"'}
54
James Broadhead

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 ' '
30
Tahsin Turkoz

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}'
16
rouble

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 ...)
10
Dennis Williamson

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.

2
Walter Tross

Essayez ceci pour un résultat numérique:
nlines = $ (wc -l <$ myfile)

1
paulonki

Que diriez-vous de sed?

wc -l /path/to/file.ext | sed 's/ *\([0-9]* \).*/\1/'
1
mgold
files=`ls`
echo "$files" | wc -l | Perl -pe "s#^\s+##"
0
Pedro Reis

"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

0
user8155253
typeset -i a=$(wc -l fileName.dat  | xargs echo | cut -d' ' -f1)
0
GeorgesMakarios

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.

0
Aif