Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/02/2017, à 12:12

_matt_44

Lister , lire et compter le nombre de ligne dans plusieurs fichiers

Bonjour,

Voilà j'ai une liste de fichier que je liste de la manière suivante :

[root@xxxxxxxxxxxx ~]# ls -l /appli/cftArchive/CFT/20170*[6789012]/ITFR15/OUT-ITFR1504/
/appli/cftArchive/CFT/20170216/ITFR15/OUT-ITFR1504/:
total 924
-rw-rw-r-- 1 ifs ifs 447679 Feb 16 14:15 IFDSCF_STATUS_23G_20170216_141917.dat
-rw-rw-r-- 1 ifs ifs 483865 Feb 16 22:39 IFDSCF_STATUS_23G_20170216_224230.dat

/appli/cftArchive/CFT/20170217/ITFR15/OUT-ITFR1504/:
total 920
-rw-rw-r-- 1 ifs ifs 477290 Feb 17 14:15 IFDSCF_STATUS_23G_20170217_141751.dat
-rw-rw-r-- 1 ifs ifs 452375 Feb 17 22:42 IFDSCF_STATUS_23G_20170217_224424.dat

/appli/cftArchive/CFT/20170218/ITFR15/OUT-ITFR1504/:
total 720
-rw-rw-r-- 1 ifs ifs 723803 Feb 18 15:30 IFDSCF_STATUS_23G_20170218_153128.dat
-rw-rw-r-- 1 ifs ifs   7050 Feb 18 22:15 IFDSCF_STATUS_23G_20170218_221556.dat

/appli/cftArchive/CFT/20170219/ITFR15/OUT-ITFR1504/:
total 8
-rw-rw-r-- 1 ifs ifs  705 Feb 19 14:15 IFDSCF_STATUS_23G_20170219_141500.dat
-rw-rw-r-- 1 ifs ifs 1175 Feb 19 22:28 IFDSCF_STATUS_23G_20170219_222811.dat

/appli/cftArchive/CFT/20170220/ITFR15/OUT-ITFR1504/:
total 1028
-rw-rw-r-- 1 ifs ifs 586335 Feb 20 14:15 IFDSCF_STATUS_23G_20170220_141807.dat
-rw-rw-r-- 1 ifs ifs 453080 Feb 20 22:43 IFDSCF_STATUS_23G_20170220_224534.dat

/appli/cftArchive/CFT/20170221/ITFR15/OUT-ITFR1504/:
total 848
-rw-rw-r-- 1 ifs ifs 449560 Feb 21 14:15 IFDSCF_STATUS_23G_20170221_141640.dat
-rw-rw-r-- 1 ifs ifs 406327 Feb 21 22:33 IFDSCF_STATUS_23G_20170221_223414.dat

/appli/cftArchive/CFT/20170222/ITFR15/OUT-ITFR1504/:
total 888
-rw-rw-r-- 1 ifs ifs 411986 Feb 22 14:15 IFDSCF_STATUS_23G_20170222_141518.dat
-rw-rw-r-- 1 ifs ifs 484571 Feb 22 22:34 IFDSCF_STATUS_23G_20170222_223442.dat

Je dois compter le nombre total de ligne de chaque fichier.

Actuellement je passe la commande suivante sur chaque fichier :

cat /appli/cftArchive/CFT/20170216/ITFR15/OUT-ITFR1504/IFDSCF_STATUS_23G_20170216_141917.dat | wc -l

Puis enfin pour l'addition cette commande :

echo '1905 + 2059 + 2031 + 1925 + 3080 + 30 + 3 + 5 + 2495 + 1928 + 1913 + 1729 + 1753 + 2063' | bc

Ce qui me donne le résultat.

Je souhaiterai pouvoir automatiser le processus?

Mais la difficulté viens du fait que je filtre certains répertoires via mon ls

/appli/cftArchive/CFT/20170*[6789012]/ITFR15/OUT-ITFR1504/

Et du coup via le find je me récupère tout et ce n'est pas ce que je souhaite.

Hors ligne

#2 Le 23/02/2017, à 12:22

Watael

Re : Lister , lire et compter le nombre de ligne dans plusieurs fichiers

salut,

ce n'est pas ls qui filtre, c'est le shell qui effectue le Développement des chemins (les répertoires dont le nom commence par 20170n et qui finissent par 0,1,2,6,7,8, ou 9).

le shell sait parfaitement faire des calculs arithmétiques sur des entiers.

il faut donc
ouvrir une boucle sur les fichiers des répertoires désirés
vérifier que c'est bien un fichier
additionner le nombre de lignes (wc -l < fichier, sans UUOC) au total de nombre de lignes
fermer la boucle
afficher le total !

ou

tu concatènes tous les fichiers que fait apparaître le Développement des chemins en pipant vers wc -l

Dernière modification par Watael (Le 23/02/2017, à 12:24)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 23/02/2017, à 14:13

_matt_44

Re : Lister , lire et compter le nombre de ligne dans plusieurs fichiers

Watael a écrit :

salut,
tu concatènes tous les fichiers que fait apparaître le Développement des chemins en pipant vers wc -l

C'est déjà ce que je fais ici je pense ?!

cat /appli/cftArchive/CFT/20170216/ITFR15/OUT-ITFR1504/IFDSCF_STATUS_23G_20170216_141917.dat | wc -l

via cette méthode je ne vois pas bien comment en une seule commande obtenir le nombre de ligne de tous les fichiers.
Pour la première option, je suis débutant et ne maitrise pas bien les scripts shell.

Hors ligne

#4 Le 23/02/2017, à 14:28

_matt_44

Re : Lister , lire et compter le nombre de ligne dans plusieurs fichiers

J'ai finalement trouver cette solution qui est beaucoup mieux déjà :

find /appli/cftArchive/CFT/20170*[6789012]/ITFR15/OUT-ITFR1504/ -type f | xargs cat | wc -l

Hors ligne

#5 Le 23/02/2017, à 14:50

Watael

Re : Lister , lire et compter le nombre de ligne dans plusieurs fichiers

non, concaténer, ça veut dire mettre à la suite plusieurs fichiers.
dans cat fichier | wc -l, le cat ne sert à rien, puisqu'il n'y a qu'un fichier.

wc -l < fichier

ainsi on n'obtient que le nombre d'alinéa.

cat /appli/cftArchive/CFT/20170*[0126789]/ITFR15/OUT-ITFR1504/*.dat | wc -l

KISS

Dernière modification par Watael (Le 23/02/2017, à 14:51)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 23/02/2017, à 15:14

MicP

Re : Lister , lire et compter le nombre de ligne dans plusieurs fichiers

En fait, si on lui donne la liste de tous les fichiers à traiter,
wc calcule et retourne aussi le total du nombre de lignes contenues dans les fichiers :

michel@debg53sw:~$ wc -l $(find ./appli/cftArchive/CFT/*/ITFR15/OUT-ITFR1504 -maxdepth 1 -type f -name "*.txt")
 163 ./appli/cftArchive/CFT/20160219/ITFR15/OUT-ITFR1504/mzt2.txt
 163 ./appli/cftArchive/CFT/20160519/ITFR15/OUT-ITFR1504/mzt3.txt
 163 ./appli/cftArchive/CFT/20160519/ITFR15/OUT-ITFR1504/mzt5.txt
 205 ./appli/cftArchive/CFT/20160519/ITFR15/OUT-ITFR1504/mzt6.txt
 163 ./appli/cftArchive/CFT/20170219/ITFR15/OUT-ITFR1504/mzt2.txt
 857 total
michel@debg53sw:~$ 

Dernière modification par MicP (Le 23/02/2017, à 15:16)

Hors ligne

#7 Le 23/02/2017, à 15:27

Watael

Re : Lister , lire et compter le nombre de ligne dans plusieurs fichiers

attention aux fichiers avec des noms qui contiendraient des espaces ou autre.

il est préférable de passer par -exec.

edit: ah, mais alors on n'a pas le total... sad

Dernière modification par Watael (Le 23/02/2017, à 15:28)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 23/02/2017, à 16:38

MicP

Re : Lister , lire et compter le nombre de ligne dans plusieurs fichiers

Avec un nom de fichier contenant des caractères espace,
et en utilisant xargs :

michel@debg53sw:~$ find ./appli/cftArchive/CFT/*/ITFR15/OUT-ITFR1504 -type f -name "*.txt" -print0 | xargs -0 wc -l
 163 ./appli/cftArchive/CFT/20160219/ITFR15/OUT-ITFR1504/OUT-ITFR1504_mzt2.txt
  21 ./appli/cftArchive/CFT/20160219/ITFR15/OUT-ITFR1504/OUT-ITFR1504_mzt2 et 3.txt
 163 ./appli/cftArchive/CFT/20160519/ITFR15/OUT-ITFR1504/OUT-ITFR1504_mzt5.txt
 163 ./appli/cftArchive/CFT/20160519/ITFR15/OUT-ITFR1504/OUT-ITFR1504_mzt3.txt
 205 ./appli/cftArchive/CFT/20160519/ITFR15/OUT-ITFR1504/OUT-ITFR1504_mzt6.txt
 163 ./appli/cftArchive/CFT/20170219/ITFR15/OUT-ITFR1504/OUT-ITFR1504_mzt2.txt
 878 total
michel@debg53sw:~$ 

Hors ligne

#9 Le 23/02/2017, à 17:21

Watael

Re : Lister , lire et compter le nombre de ligne dans plusieurs fichiers

+1

mais ce n'est pas ce que demandais _matt_44.
big_smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#10 Le 23/02/2017, à 17:39

LeoMajor

Re : Lister , lire et compter le nombre de ligne dans plusieurs fichiers

bonjour,

directement le résultat: nombre de lignes

awk 'END {print NR}' *.dat 2>/dev/null

plutôt que de détailler ...

awk '{files[FILENAME]=FNR}; END {for (file in files)print file,files[file]; print "total",NR}' *.dat

Hors ligne

#11 Le 23/02/2017, à 17:44

MicP

Re : Lister , lire et compter le nombre de ligne dans plusieurs fichiers

J'ai dû encore rater quelque chose. Désolé : je dois pas être encore bien en forme.

Hors ligne

#12 Le 23/02/2017, à 20:31

Hizoka

Re : Lister , lire et compter le nombre de ligne dans plusieurs fichiers

Bonsoir,
je propose :

while read fichier
do
  lignes=$(wc -l < "${fichier}")
  echo "le fichier ${fichier} contient ${lignes} ligne(s)"
  Total=$(( ${Total:-0} + ${lignes} ))
done < <(find ./appli/cftArchive/CFT/*/ITFR15/OUT-ITFR1504 -maxdepth 1 -type f -iname "*.txt")
echo "Au total, cela fait ${Total} lignes"

et on peut enlever -maxdepth 1 si on veut le mode récursif.

mais la solution de LeoMajor est vraiment pas mal smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#13 Le 23/02/2017, à 21:22

MicP

Re : Lister , lire et compter le nombre de ligne dans plusieurs fichiers

…mais la solution de LeoMajor est vraiment pas mal …

Plutôt oui !…J'étais en train de chercher du côté de sed et ed

nbLignesDansLeFichier=$(sed -n '$=' fichier)

Mais il restait quand même à faire le total des lignes trouvées.

L'intérêt que j'avais trouvé en transmettant juste la liste de fichiers à wc est aussi que de cette façon, c'est wc qui calcule et renvoie automatiquement la somme totale.

=======
Mais je suis bien embêté, peut être que je finirai par trouver, mais là, je ne vois toujours pas du tout ce qui a bien pû m'échapper…

Hors ligne

#14 Le 23/02/2017, à 22:17

Watael

Re : Lister , lire et compter le nombre de ligne dans plusieurs fichiers

la requête de _matt_44 est un peu ambiguë.
on ne comprend pas bien s'il faut compter les lignes de chaque fichier, ou le nombre total de ligne.
et il n'est pas question de l'afficher. lol

for f in /appli/cftArchive/CFT/20170*[0126789]/ITFR15/OUT-ITFR1504/*.dat
do
   test -f "$f" && {
      ((nbL=$(wc -l < "$f", nbTL+=nbL))
#      echo "$f : $nbL"
   }
done
# echo $nbTL

et s'il y a lieu de descendre dans les sous-répertoire, cf. shopt globstar

Dernière modification par Watael (Le 23/02/2017, à 22:17)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#15 Le 24/02/2017, à 06:39

pingouinux

Re : Lister , lire et compter le nombre de ligne dans plusieurs fichiers

Bonjour,
@Hizoka #12 :
Pour info, tu peux remplacer cette ligne

  Total=$(( ${Total:-0} + ${lignes} ))

par celle-ci

  ((Total+=lignes))

et il n'est même pas nécessaire d'initialiser Total en tête du script

Hors ligne

#16 Le 24/02/2017, à 09:44

Hizoka

Re : Lister , lire et compter le nombre de ligne dans plusieurs fichiers

((Total+=lignes))

je ne retrouvais plus la syntax justement smile
merci.

et il n'est même pas nécessaire d'initialiser Total en tête du script

pour le coup je ne l'ai pas fait smile
j'ai utilisé ${Total:-0} (la valeur par défaut ne sert d'ailleurs pas à grand chose...)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#17 Le 27/02/2017, à 18:12

MicP

Re : Lister , lire et compter le nombre de ligne dans plusieurs fichiers

Pour n'afficher que la somme cumulée des lignes contenues dans les fichiers,
il y a aussi :

lst="/appli/cftArchive/CFT/20170*[0126789]/ITFR15/OUT-ITFR1504/*.dat"
awk 'END {print $1}' < <(wc -l "${lst}")

Mais je suis sûr que si je connaissais un peu awk j'aurai trouvé comment me passer de la commande wc

Dernière modification par MicP (Le 27/02/2017, à 18:18)

Hors ligne

#18 Le 27/02/2017, à 18:39

Watael

Re : Lister , lire et compter le nombre de ligne dans plusieurs fichiers

comment (s)e passer de la commande wc

ça a été donné au #10.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#19 Le 27/02/2017, à 20:27

MicP

Re : Lister , lire et compter le nombre de ligne dans plusieurs fichiers

Merci,

j'avais oublié de relire le fil…

Hors ligne