2010-11-28 29 views
2

Je suis nouveau avec les scripts shell.Shell Scripting: comment choisir la valeur d'une expression de chaque ligne d'un fichier

J'ai un fichier contenant des enregistrements de la forme:

"text1: text2 = valeur2, text3 = value3, text4 = valeur4, text5 = valeur5" text1: text6: valeur6" « text1: texte2 = valeur2, texte3 = valeur3, texte4 = valeur4, texte5 = valeur5 "texte1: valeur6" "texte1: texte2 = valeur2, texte3 = valeur3, texte4 = valeur4, texte5 = valeur5" texte1: texte6: valeur6 " " texte1 : text2 = valeur2, texte3 = valeur3, texte4 = valeur4, texte5 = valeur5 "texte1: texte6: valeur6"

Maintenant, je veux écrire un script shell qui récupère le champ de valeur pour du texte. Par exemple: Je veux value2 et value5 et je sais qu'ils existeront devant text2 = et text5 =

Il n'y a pas non plus d'espace vide dans la ligne complète. Le fichier contient n lignes et je veux avoir 2 valeurs de chaque ligne (ie value2 et value5) et stocker ensuite dans une variable pour un traitement ultérieur.

Quelqu'un peut-il aider.

Merci

+0

Voulez-vous que les arguments de ligne de commande indiquent "2 & 5" cette fois-ci? '3 & 4' la prochaine fois? De plus, la dernière partie de chaque ligne ressemble au texte après 'text5' est 'value5 'text1: text6: value6" '- est-ce correct? –

Répondre

1

Je suis sûr que une solution plus élégante est possible, mais ce script bash boucles seulement à travers l'entrée et filtre

  • la valeur entre le premier = et la , suivante et
  • la valeur entre la quatrième et la =" suivante:

    while read line 
    do 
        value2=`echo "$line" | cut -d = -f 2 | cut -d , -f 1` 
        value5=`echo "$line" | cut -d = -f 5 | cut -d \" -f 1` 
        echo $value2 - $value5 # do something with $value2 and $value5 
    done 
    

Vous appelez le script comme ceci:

bash myscript.sh < mytextfile.txt 
0

De la ligne de commande avec le texte dans q.text:

gawk -F \ » '{print $ 2}' < q. txt | gawk -F: '{print $ 2}' | gawk -F, '{print $ 1 "=" $ 4}' | gawk -F = '{print $ 2 "," $ 4}'

Essayé sur Cygwin bash et cela fonctionnera. Je ne suis pas un programmeur mais j'utilise le shell cygwin et j'ai pensé que ce serait amusant d'essayer ça avec gawk.

2

En utilisant sed:

while read text2var text5var 
do 
    #something with text2var and text5var 
done < sed 's/.*:text2=\([^,]*\),.*,text5=\([^"]*\)".*/\1 \2/') inputfile 

En utilisant GNU AWK (gawk):

while read text2var text5var 
do 
    #something with text2var and text5var 
done < gawk -F ',|:|"' '{sub("[^=]*=","",$3); sub("[^=]*=","",$6); print $3, $6}' inputfile 

Pour utiliser d'autres versions de AWK qui ne sont pas des expressions régulières pour les séparateurs de champ, utilisez une expression régulière semblable à la commande sed ou utiliser beaucoup de fractionnement:

while read text2var text5var 
do 
    #something with text2var and text5var 
done < awk -F ',' '{split($1,t2,"text2="); split($4,t5,"\""); split(t5[1],t5,"="); print t2[2], t5[2]}' inputfile 

En utilisant cut:

while read text2var text5var 
do 
    #something with text2var and text5var 
done < cut -d , -f 1,4 --output-delimiter='=' inputfile | cut -d '"' -f2 | cut -d = -f1,3 | cut -d : -f 2 | cut -d = --output-delimiter=' ' -f1,2 

GNU cut peut être nécessaire pour être en mesure d'utiliser l'option --output-delimiter. C'est peut-être moche mais au moins on ne l'appelle pas quatre fois sur chaque ligne.