J'ai les trois constructions suivantes dans un script bash:
NUMOFLINES=$(wc -l $Java_TAGS_FILE)
echo $NUMOFLINES" lines"
echo $(wc -l $Java_TAGS_FILE)" lines"
echo "$(wc -l $Java_TAGS_FILE) lines"
Et ils produisent tous deux une sortie identique lorsque le script est exécuté:
121711 /home/slash/.Java_base.tag lines
121711 /home/slash/.Java_base.tag lines
121711 /home/slash/.Java_base.tag lines
C'est à dire. le nom du fichier est également répercuté (ce que je ne veux pas). Pourquoi ces scriplets échouent-ils et comment devrais-je produire un clean:
121711 lines
?
Vous pouvez éviter d'avoir votre nom de fichier incorporé dans la variable NUMOFLINES en utilisant la redirection à partir de Java_TAGS_FILE, plutôt que de transmettre le nom de fichier en tant qu'argument à wc . Par exemple:
NUMOFLINES=$(wc -l < "$Java_TAGS_FILE")
L'utilitaire wc n'imprimera pas le nom du fichier dans sa sortie si l'entrée provient d'un opérateur de canal ou de redirection. Considérez ces différents exemples:
# wc shows filename when the file is an argument
$ wc -l /etc/passwd
41 /etc/passwd
# filename is ignored when piped in on standard input
$ cat /etc/passwd | wc -l
41
# unusual redirection, but wc still ignores the filename
$ < /etc/passwd wc -l
41
# typical redirection, taking standard input from a file
$ wc -l < /etc/passwd
41
Comme vous pouvez le constater, le seul moment wc imprimera le nom du fichier, c’est lorsqu’il sera transmis en tant qu’argument, plutôt que comme donnée sur une entrée standard. Dans certains cas, vous pouvez souhaiter que le nom de fichier soit imprimé. Il est donc utile de comprendre quand il sera affiché.
wc
ne peut pas obtenir le nom du fichier si vous ne le lui donnez pas.
wc -l < "$Java_TAGS_FILE"
Vous pouvez aussi utiliser awk:
awk 'END {print NR,"lines"}' filename
Ou
awk 'END {print NR}' filename
(appliquer sur Mac, et probablement d'autres Unix)
En réalité, il existe un problème avec l'approche wc: la dernière ligne n'est pas comptée si elle ne se termine pas par le symbole de fin de ligne.
Utilisez ceci à la place
nbLines=$(cat -n file.txt | tail -n 1 | cut -f1 | xargs)
ou même mieux (merci gniourf_gniourf):
nblines=$(grep -c '' file.txt)
Remarque: l'approche awk par chilicuil fonctionne également.
C'est très simple:
NUMOFLINES=$(cat $Java_TAGS_FILE | wc -l )
ou
NUMOFLINES=$(wc -l $Java_TAGS_FILE | awk '{print $1}')