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 27/06/2017, à 16:44

MINYA

Compter le nombre de numéro sur une ligne à partir d'une colonne AWK

Bonjour,

J'essaye de compter le nombre de numéro après le mot "Position"  , voici un exemple de fichier que je cherche à traiter :

  
 ##classe1 score 
premier          abc    12 09 6            personne=nom1 17 20 Position=5 69 156 221;  ====> Ici le nombre de position que je veux à partir de Position est : 4
premier          abc     11 9  6            personne=nom1 16 19 ;
premier         abc     30 9 15           personne=nom1 14 19  Position=5 12; ======> le nombre de position ici est 2
##classe2 score 
 
deuxième       abc     5 7 9            personne=nom2 15 17 Position=7 14 25 29 37 42 59 62 77 96 102  ; =====> le nombre de position ici est : 11 
deuxième       abc     56 5 9          personne=nom2 10 20  ;
deuxième      abc     8 9 4           personne=nom2  8 13;
deuxième     abc    1 56 7           personne=nom2 5 12 ;     

Merci

Dernière modification par MINYA (Le 27/06/2017, à 16:45)


Peace

Hors ligne

#2 Le 27/06/2017, à 18:47

kholo

Re : Compter le nombre de numéro sur une ligne à partir d'une colonne AWK

salut,

comme ça par exemple :

#!/bin/bash
# ----------------------------------------------
# nomlogiciel="${0##*/}"
# FONCTION=""
# VERSION="alpha"
# NOTES DE VERSIONS
# ----------------------------------------------
 
lefichier="##classe1 score 
premier          abc    12 09 6            personne=nom1 17 20 Position=5 69 156 221;  ====> Ici le nombre de position que je veux à partir de Position est : 4
premier          abc     11 9  6            personne=nom1 16 19 ;
premier         abc     30 9 15           personne=nom1 14 19  Position=5 12; ======> le nombre de position ici est 2
##classe2 score 
 
deuxième       abc     5 7 9            personne=nom2 15 17 Position=7 14 25 29 37 42 59 62 77 96 102  ; =====> le nombre de position ici est : 11 
deuxième       abc     56 5 9          personne=nom2 10 20  ;
deuxième      abc     8 9 4           personne=nom2  8 13;
deuxième     abc    1 56 7           personne=nom2 5 12 ;     "

IFS=$'\n' lefichier=( $lefichier )

for uneLigne in ${lefichier[@]}
do
	if [ -n "$(echo ${uneLigne} | grep 'Position=')" ] 
	then 
		Positions=${uneLigne##*Position=}
		Positions=${Positions%%;*}
		echo "Positions = ${Positions}"
		IFS=' ' nbrepositions=( ${Positions} )
		nbrepositions=${#nbrepositions[@]}
		echo "nbre de positions = ${nbrepositions}"
		echo ""
	fi
done

exit 0

renvoie :

Positions = 5 69 156 221
nbre de positions = 4

Positions = 5 12
nbre de positions = 2

Positions = 7 14 25 29 37 42 59 62 77 96 102  
nbre de positions = 11

Dernière modification par kholo (Le 28/06/2017, à 09:28)

Hors ligne

#3 Le 27/06/2017, à 19:13

Watael

Re : Compter le nombre de numéro sur une ligne à partir d'une colonne AWK

J'essaye de compter le nombre de numéro après le mot "Position"

et qu'est-ce que tu proposes ?

pour quelqu'un qui n'est pas informaticienne, c'est quand même fou le nombre d'exercices auxquels il t'est demandé d'apporter une solution !

il y a des gens qui font des efforts pour être intelligible, qui exposent proprement leur requête, montrent leur premier jet, explique où ils bloquent..., et que j'ai plaisir à aider.


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

Hors ligne

#4 Le 28/06/2017, à 08:14

kholo

Re : Compter le nombre de numéro sur une ligne à partir d'une colonne AWK

justement profitons de ce post pour centraliser tout ça
https://forum.ubuntu-fr.org/viewtopic.php?id=2010829
https://forum.ubuntu-fr.org/viewtopic.php?id=2011076
https://forum.ubuntu-fr.org/viewtopic.php?id=2011344
https://forum.ubuntu-fr.org/viewtopic.php?id=2011382
si tu veux apprendre, mets ton code ici pour que les aidants puissent te conseiller

...
pour expliquer ma direction...
pour mon script qui n'utilise pas awk, j'utilise les tableaux...
ça permettra peut être de comprendre le découpage en tableaux puis le travail sur les membres.
je récupère chaque ligne dans une variable
je transforme cette variable en tableau

variable=( $variable )

avant ça il faut adapter IFS (le séparateur)

IFS=$'\n' variable=( $variable )

IFS = saut de ligne
ensuite pour chaque ligne :

for uneLigne in ${variable[@]}
do 
    quelquechose
done

et là tu parses chaque ligne :
je commence par isoler 'Position='
et je vire tout se qui est après ';'
ensuite transformation en tableau et compte des membres

Positions=${uneLigne##*Position=}
Positions=${Positions%%;*}
echo "Positions = ${Positions}"
IFS=' ' nbrepositions=( ${Positions} )
nbrepositions=${#nbrepositions[@]}
echo "nbre de posistions = ${nbrepositions}"

tu as aussi accès à chaque membre du tableau :

for membre in ${[@]}
    do echo "le membre est : $membre"
done

ou accéder aux membres par leur index
(par défaut de 0 à n-1)...

... et pour awk : RTFM !
http://www.funix.org/fr/unix/awk.htm
https://www.shellunix.com/awk.html
et le forum (ici 2010 !)
https://forum.ubuntu-fr.org/viewtopic.php?id=389505

Hors ligne

#5 Le 28/06/2017, à 10:47

Watael

Re : Compter le nombre de numéro sur une ligne à partir d'une colonne AWK

je récupère chaque ligne dans une variable
je transforme cette variable en tableau

qu'est-ce que tu t'enquiquine ?

mapfile -t ar <"$fichier"
for line in "${ar[@]}"...

ça t'évite les modifications périlleuses de l'IFS.


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

Hors ligne

#6 Le 28/06/2017, à 11:31

kholo

Re : Compter le nombre de numéro sur une ligne à partir d'une colonne AWK

je test
je prend le texte et le met dans un fichier externe : "fichieraparser.txt"
puis

#!/bin/bash
fichier="fichieraparser.txt"
mapfile -t txtfichier <"$fichier"
for uneLigne in "${txtfichier[@]}"
do
	echo "ligne : $uneLigne"
done

ça marche
ou

#!/bin/bash
fichier="##classe1 score 
premier          abc    12 09 6            personne=nom1 17 20 Position=5 69 156 221;  ====> Ici le nombre de position que je veux à partir de Position est : 4
premier          abc     11 9  6            personne=nom1 16 19 ;
premier         abc     30 9 15           personne=nom1 14 19  Position=5 12; ======> le nombre de position ici est 2
##classe2 score 
 
deuxième       abc     5 7 9            personne=nom2 15 17 Position=7 14 25 29 37 42 59 62 77 96 102  ; =====> le nombre de position ici est : 11 
deuxième       abc     56 5 9          personne=nom2 10 20  ;
deuxième      abc     8 9 4           personne=nom2  8 13;
deuxième     abc    1 56 7           personne=nom2 5 12 ;     "
mapfile -t txtfichier <<<"$fichier"
for uneLigne in "${txtfichier[@]}"
do
	echo "ligne : $uneLigne"
done

ok je pige mapfile, il faut juste penser à quotter la variable pour la lire
ce que je ne fais pas avec ma transformation en tableau.

**************************************************************************
avec read pour parser les valeurs !

#!/bin/bash
# ----------------------------------------------
# nomlogiciel="${0##*/}"
# FONCTION=""
# VERSION="alpha"
# NOTES DE VERSIONS
# ----------------------------------------------
# 
# ----------------------------------------------
texte="##classe1 score 
premier          abc    12 09 6            personne=nom1 17 20 Position=5 69 156 221;  ====> Ici le nombre de position que je veux à partir de Position est : 4
premier          abc     11 9  6            personne=nom1 16 19 ;
premier         abc     30 9 15           personne=nom1 14 19  Position=5 12; ======> le nombre de position ici est 2
##classe2 score 
 
deuxième       abc     5 7 9            personne=nom2 15 17 Position=7 14 25 29 37 42 59 62 77 96 102  ; =====> le nombre de position ici est : 11 
deuxième       abc     56 5 9          personne=nom2 10 20  ;
deuxième      abc     8 9 4           personne=nom2  8 13;
deuxième     abc    1 56 7           personne=nom2 5 12 ;     "
mapfile -t toutLeTexte <<< "$texte"


# OU DEPUIS UN FICHIER
# fichier="fichieraparser.txt"
# mapfile -t toutLeTexte <"$fichier"

for uneLigne in "${toutLeTexte[@]}"
do
	# echo "ligne : $uneLigne"
	if [ -n "$(echo ${uneLigne} | grep 'Position=')" ] 
	then 
		echo "ligne : $uneLigne"
		Positions=${uneLigne##*Position=}
		Positions=${Positions%%;*}
		echo "Positions : ${Positions}"
		read -a nbrepositions <<< "${Positions}"
		nbrepositions=${#nbrepositions[@]}
		echo "nbre de positions = ${nbrepositions}"
		echo ""
	fi
done

exit 0

me renvoie :

ligne : premier          abc    12 09 6            personne=nom1 17 20 Position=5 69 156 221;  ====> Ici le nombre de position que je veux à partir de Position est : 4
Positions : 5 69 156 221
nbre de positions = 4

ligne : premier         abc     30 9 15           personne=nom1 14 19  Position=5 12; ======> le nombre de position ici est 2
Positions : 5 12
nbre de positions = 2

ligne : deuxième       abc     5 7 9            personne=nom2 15 17 Position=7 14 25 29 37 42 59 62 77 96 102  ; =====> le nombre de position ici est : 11 
Positions : 7 14 25 29 37 42 59 62 77 96 102  
nbre de positions = 11

Dernière modification par kholo (Le 28/06/2017, à 11:40)

Hors ligne

#7 Le 28/06/2017, à 12:24

Watael

Re : Compter le nombre de numéro sur une ligne à partir d'une colonne AWK

il faut juste penser à quotter la variable pour la lire

il faut toujours mettre les variables entre guillemets. toujours !


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

Hors ligne

#8 Le 28/06/2017, à 12:39

kholo

Re : Compter le nombre de numéro sur une ligne à partir d'une colonne AWK

Watael a écrit :

il faut juste penser à quotter la variable pour la lire

il faut toujours mettre les variables entre guillemets. toujours !

je comprend, mais c'est là que le bas blesse :
si je quotte ma variable dans mon for ça marche po...
for uneLigne in ${lefichier[@]} <> for uneLigne in "${lefichier[@]}"
le deuxième ne marche pas comme attendu dans ma procédure
car il prend la variable comme un bloc (l'index 0) !

Hors ligne

#9 Le 28/06/2017, à 14:15

Watael

Re : Compter le nombre de numéro sur une ligne à partir d'une colonne AWK

non, le bât.

$ cat "$fichier"
##classe1 score 
premier          abc    12 09 6            personne=nom1 17 20 Position=5 69 156 221;  ====> Ici le nombre de position que je veux à partir de Position est : 4
premier          abc     11 9  6            personne=nom1 16 19 ;
premier         abc     30 9 15           personne=nom1 14 19  Position=5 12; ======> le nombre de position ici est 2
##classe2 score 
 
deuxième       abc     5 7 9            personne=nom2 15 17 Position=7 14 25 29 37 42 59 62 77 96 102  ; =====> le nombre de position ici est : 11 
deuxième       abc     56 5 9          personne=nom2 10 20  ;
deuxième      abc     8 9 4           personne=nom2  8 13;
deuxième     abc    1 56 7           personne=nom2 5 12 ;     "
$ mapfile -t array < "$fichier"
$ for line in "${array[@]}"; do if [[ $line =~ Position= ]]; then echo ">-$line-<"; fi; done
>-premier          abc    12 09 6            personne=nom1 17 20 Position=5 69 156 221;  ====> Ici le nombre de position que je veux à partir de Position est : 4-<
>-premier         abc     30 9 15           personne=nom1 14 19  Position=5 12; ======> le nombre de position ici est 2-<
>-deuxième       abc     5 7 9            personne=nom2 15 17 Position=7 14 25 29 37 42 59 62 77 96 102  ; =====> le nombre de position ici est : 11 -<

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

Hors ligne

#10 Le 28/06/2017, à 14:50

kholo

Re : Compter le nombre de numéro sur une ligne à partir d'une colonne AWK

je n'avais pas cherché le Bât... merci !

[[ $line =~ Position= ]] au lieu de [ -n "$(echo ${uneLigne} | grep 'Position=')" ]
ok, j'ai encore du travail sur les tests...

on en est là :

#!/bin/bash
#*********************************************************
fichier="##classe1 score 
premier          abc    12 09 6            personne=nom1 17 20 Position=5 69 156 221;  ====> Ici le nombre de position que je veux à partir de Position est : 4
premier          abc     11 9  6            personne=nom1 16 19 ;
premier         abc     30 9 15           personne=nom1 14 19  Position=5 12; ======> le nombre de position ici est 2
##classe2 score 
 
deuxième       abc     5 7 9            personne=nom2 15 17 Position=7 14 25 29 37 42 59 62 77 96 102  ; =====> le nombre de position ici est : 11 
deuxième       abc     56 5 9          personne=nom2 10 20  ;
deuxième      abc     8 9 4           personne=nom2  8 13;
deuxième     abc    1 56 7           personne=nom2 5 12 ;     "

mapfile -t toutLeTexte <<< "$fichier"

#*********************************************************
# OU DEPUIS UN FICHIER
# fichier="fichieraparser.txt"
# mapfile -t toutLeTexte <"$fichier"

#*********************************************************
for uneLigne in "${toutLeTexte[@]}"; 
do 
	if [[ $uneLigne =~ Position= ]]; 
	then 
		echo ">-$uneLigne-<"; # ;°)
		Positions=${uneLigne##*Position=}
		Positions=${Positions%%;*}
		echo "Positions : ${Positions}"
		read -a nbrepositions <<< "${Positions}"
		nbrepositions=${#nbrepositions[@]}
		echo "nbre de positions = ${nbrepositions}"
		echo ""
	fi; 
done

exit 0

renvoie :

>-premier          abc    12 09 6            personne=nom1 17 20 Position=5 69 156 221;  ====> Ici le nombre de position que je veux à partir de Position est : 4-<
Positions : 5 69 156 221
nbre de positions = 4

>-premier         abc     30 9 15           personne=nom1 14 19  Position=5 12; ======> le nombre de position ici est 2-<
Positions : 5 12
nbre de positions = 2

>-deuxième       abc     5 7 9            personne=nom2 15 17 Position=7 14 25 29 37 42 59 62 77 96 102  ; =====> le nombre de position ici est : 11 -<
Positions : 7 14 25 29 37 42 59 62 77 96 102  
nbre de positions = 11

Hors ligne

#11 Le 28/06/2017, à 21:15

Watael

Re : Compter le nombre de numéro sur une ligne à partir d'une colonne AWK

et, ça ne correspond pas à la sortie attendue ?

PS: tu dois aussi lutter contre les exit 0. wink


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

Hors ligne

#12 Le 29/06/2017, à 07:52

kholo

Re : Compter le nombre de numéro sur une ligne à partir d'une colonne AWK

pour la sortie, il faut demander à MINYA !
à ouvrir des post pour chaque point de sa recherche, j'ai squatté celui ci !
mon idée était d'isoler une partie des infos...
comme c'est le même principe pour isoler d'autres valeurs, ça donne une ligne directrice
car les autres fils vont vers awk...

ah... mes exit 0
je pensais qu'en finissant le script avec, cela relayait le résultat du script
ou d'une façon plus simple il fallait finir par un exit 0...
on m'a menti à l'insu de mon plein gré ? hmm

Hors ligne