récupérer lignes et valeurs dans une fichier texte

Bonjour,

Voici un exemple de fichier texte que j’essaye de traiter avec grep and co :

J’essaye de récupérer toutes les lignes qui sont strictement égale à "0/1"
Par la suite je cherche à récupérer la valeur “VAL1-1” ET “VAL1-2

Pour commencer je n’arrive pas à récupérer les deux lignes “0/1”, j’ai juste que la première :

val="0/1"
test=$(grep -w ${val} /root/results.log)

Merci !

Voici ce que ça donne chez moi avec une copie du contenu de ton fichier dans un fichier nommé “results.log” :

dave@HAL9000:~$ export val="0/1" dave@HAL9000:~$ grep -w ${val} results.log 0/1 735921 5505 12 14 0/1 45351 135 4892 78 dave@HAL9000:~$ export test=$(grep -w ${val} results.log) dave@HAL9000:~$ echo $test 0/1 735921 5505 12 14 0/1 45351 135 4892 78

Je ne connais pas assez bien le comportement de grep et bash pour t’expliquer pourquoi la valeur de $test est déclarée sur une ligne unique, mais les deux valeurs sont bien présentes.

Peux tu poster un peu plus de ton code pour qu’on puisse mettre tes commandes en contexte ?

Pour avoir les deux lignes je fais comme ça :

#!/bin/bash
val="0/1"
test=$(grep -w ${val} /root/results.log)

_VAL_="$(echo "${test}")"

_VAL1_="$(echo "${_VAL_}" | head -n 1)"
_VAL2_="$(echo "${_VAL_}" | head -n 2)"


echo ${_VAL1_} 
echo ${_VAL2_}

Par contre si j’essaye de mettre un “cut -d ’ ’ -f2” après les deux echo

echo ${_VAL1_} | cut -d ' ' -f2
echo ${_VAL2_} | cut -d ' ' -f2

Je récupère la même valeur : 735921

:119

Si je fais :

echo ${_VAL1_} | cut -d ' ' -f2
echo ${_VAL2_} | cut -d ' ' -f8

Je récupère bien 735921 et 45351

Donc j’ai l’impression que les valeurs VAL1-1 et VAL1-2 sont sur la même ligne.
Je n’ai pas deux lignes contenant 0/1 de VAL1-1 et le 0/1 de VAL1-2 :013

Je ne suis pas très très bon en programmation,
mais si le résultat de ce script te convient…

#!/bin/bash
val="0/1"
test=$(grep -w ${val} /root/results.log)

# sauvegarde de la variable "IFS"
#  afin de pouvoir la restaurer à la fin du script
ifstmp=$IFS

# modification de la variable "IFS" pour le caractère de fin de ligne
IFS="\n"

# pour chaque ligne du retour de la commande "grep" précédente
for ligne in $test; do

  # afficher le deuxième champ de la ligne
  echo $ligne | awk '{print $2}'

# opération effectuée pour cette ligne,
# on passe à la ligne suivante (boucle "for")
#  jusqu'à plus de ligne à lire dans la variable "test"
done

# restauration de la variable "IFS"
IFS=$ifstmp

Ou bien, en une ligne :

Ou bien, en une autre ligne :

Donc :
[code]val1=$(awk '$1 == "0/1"{print $2}')
val2=$(awk '$1 == "0/1"{print $3}')[/code]

Si ton fichier est énorme :
[code]values=( $(awk '$1 == "0/1"{print $2,$3}') )
echo "${values[1]}"
echo "${values[2]}"[/code]

Donc :

val1=$(awk '$1 == "0/1"{print $2}') val2=$(awk '$1 == "0/1"{print $3}')

Si ton fichier est énorme :

values=( $(awk '$1 == "0/1"{print $2,$3}') ) echo "${values[1]}" echo "${values[2]}"

@MicP
Ok cela fonctionne, merci :023

@MisterFreez
Je n’arrive pas a faire fonctionner ton code… Je suis sous Bash…

Je viens de corriger une faute de frappe ça devrait mieux fonctionner.

@ seb regarde aussi ce que propose MisterFreez:

Le script :

values=( $(awk '$1 == "0/1"{print $2,$3}') )
echo "values    => ${values[*]}"
echo
echo "values[0] => ${values[0]}"
echo "values[1] => ${values[1]}"
echo "values[2] => ${values[2]}"
echo "values[3] => ${values[3]}"

@ MisterFreez Va falloir que je démonte tout ça pour apprendre,
parce que entre la “purée que j’ai pondu” et ça, y-a vraiment pas photo.
Un grand Merci à MisterFreez.

Oui je viens de modifier et cela fonctionne aussi :041

Un grand merci à vous deux :038