Téléchargement
illégal
Posez votre question Signaler

Shell sed ou awk [Résolu]

yo49 - Dernière réponse le 5 mars 2010 à 13:56
Bonjour, au pro du shell
j'ai un liste.txt comme celui-ci, et je souhaite ajouter ou soustraire 1 au dernier chiffre mais seulement sur un enregistrement en particulier...
Peugeot | 5008 | 14/10/2009 | 5
Peugeot | 308 CC | 01/03/2009 | 6
Citroën | C-Crosser | 01/06/2007 | 5
Peugeot | 308 RCZ | 01/04/2010 | 0
En tapant "sed 's/17/16/' liste.txt" je fais l'opération mais sur toutes les lignes ! Comment y remédier?
Merci
Lire la suite 

Shell sed ou awk »

18 réponses
Réponse
+2
moins plus
Salut,

awk est plus adapté pour ton cas :

 awk -F'|' '$2 ~ /5008/ {$4++} {print }'

;-))
Ajouter un commentaire
Réponse
+0
moins plus
Salut,

http://www.commentcamarche.net/faq/5588-sed-substitution#substitution-conditionnee
Ajouter un commentaire
Réponse
+0
moins plus
Merci pour la précision, j'avais déjà regardé en diagonale ce document.

D'après ce que je veux :
modele="5008"
stock=5

sed '/$modele/ s/$stock/$stock+1/' liste.txt
Ajouter un commentaire
Réponse
+0
moins plus
Ah oui en effet!

Je cherchais la solution idéale entre Grep, Sed et Awk.
En fait, cette ligne combine Sed et Awk ...
Il me reste à "variabilisé" le tout et écrasé mon fic original par le nouveau!

a+
Ajouter un commentaire
Réponse
+0
moins plus
Donc au final :

$voiture="5008"
awk -F'|' '$2 ~ /'$voiture'/ {$4++} {OFS="|";print}' liste.txt >> listeT.txt
mv listeT.txt liste.txt
echo "Ajout effectué";;

Je cherche la ligne avec le nom de mon modèle ('colonne' 2) et je lui ajoute 1 (4ième 'colonne'). La liste est réédité ailleurs puis écrasée à la place de la liste d'origine...

Merci à vous tous!
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,

Cependant, lorsque je veux attribuer une valeur à mon '4ième champs', la fonction suivante ne fonctionne pas:

nb= 21
awk -F'|' '$2 ~ /'$voiture'/ {$4==$nb} {OFS="|";print}' liste.txt >> listeT.txt

Pouvez me dire pourquoi, et comment contourner le problème?
jipicy- 4 mars 2010 à 10:07
Re-

Il faut soit déclarer ta variable dans awk :

awk -F'|' -v nb=21 '$2 ~ /'$voiture'/ {$4==nb} {OFS="|";print}' liste.txt >> listeT.txt 

Soit jouer avec les quotes :

nb=21
awk -F'|' '$2 ~ /'$voiture'/ {$4=='"$nb"'} {OFS="|";print}' liste.txt >> listeT.txt

Ajouter un commentaire
Réponse
+0
moins plus
Bizarre, ta solution n'as pas l'air de fonctionner... j'ai aucunes erreurs mais aucun changement!

awk -F'|' '$2 ~ /'$voiture'/ {$4=='"$nb"'} {OFS="|";print}'

(Alors que, bien-sûr, celle-ci fonctionne: awk -F'|' '$2 ~ /'$voiture'/ {$4=="21"} {OFS="|";print}')
jipicy- 4 mars 2010 à 11:00
Alors que, bien-sûr, celle-ci fonctionne: awk -F'|' '$2 ~ /'$voiture'/ {$4=="21"} {OFS="|";print}'
C'est bizarre d'ailleurs que le '$voiture' soit interprété ;-\

Quid de l'autre solution '-v nb=21' ?
Ajouter un commentaire
Réponse
+0
moins plus
Avec l'autre solution, c'est la même chose.

J'ai essayé en modifiant $2 ou $1 mais ça ne marche pas.
En affichant la valeur avant et après l'opération : c'est la même!

Peugeot | 308 RCZ | 01/04/2010 | 7

nb=21
awk -F'|' '$2 ~ /'$voiture'/ {print $4;$4=='"$nb"';print $4} {OFS="|";print}'

Résultat :
7
7
Peugeot | 308 RCZ | 01/04/2010 | 7
jipicy- 4 mars 2010 à 11:28
pffff ;-((

 nb=5 ; voiture=5008 ;  awk -F'|' '$2 ~ /'"$voiture"'/ && $4 == '"$nb"' {OFS="|";print}' 
yo49 - 5 mars 2010 à 11:14
Je ne comprend pas, cette instruction efface complétement mon fichier liste.txt.

Je fais quelques essais!
jipicy- 5 mars 2010 à 11:24
Je ne comprends pas non plus, chez moi je n'ai pas de problème ;-\

jp@MDK:~/tmpfs ssh$ cat plop 
Peugeot | 5008 | 14/10/2009 | 5
Peugeot | 308 CC | 01/03/2009 | 6
Citroën | C-Crosser | 01/06/2007 | 5
Peugeot | 308 RCZ | 01/04/2010 | 0

jp@MDK:~/tmpfs ssh$  nb=5 ; voiture=5008 ;  awk -F'|' '$2 ~ /'"$voiture"'/ && $4 == '"$nb"' {OFS="|";print}' plop 
Peugeot | 5008 | 14/10/2009 | 5

jp@MDK:~/tmpfs ssh$  cat plop 
Peugeot | 5008 | 14/10/2009 | 5
Peugeot | 308 CC | 01/03/2009 | 6
Citroën | C-Crosser | 01/06/2007 | 5
Peugeot | 308 RCZ | 01/04/2010 | 0

jp@MDK:~/tmpfs ssh$
Ajouter un commentaire
Réponse
+0
moins plus
bonjour,

Cette commande "n'agit pas", comme les précédentes ... je fais plusieurs autres tests notamment avec les côtes ... etc
jipicy- 5 mars 2010 à 11:38
Et celle là ?

awk -F'|' -v nb=5 -v voiture=5008 '$2==voiture && $4==nb {OFS="|";print}'
Ajouter un commentaire
Réponse
+0
moins plus
Mon message n°12 est faux! Sorry

Ton exemple ne justifie pas que ça fonctionne puisque tu prend la valeur nb=5 qui est la valeur d'origine de l'enregistrement.

J'ai déjà essayé sans guillemets, il bloque ma console quelques minutes et je suis obligé de sortir par Ctr +D
jipicy- 5 mars 2010 à 11:46
Et c'est quoi le bon exemple alors ???
Ajouter un commentaire
Réponse
+0
moins plus
ah! j'ai tilté! Au temps pour moi, je me suis mal exprimé.
Je voulais modifier l'enregistrement (4ième champs) dont le modèle est 5008 et non affiché l'enregistrement dont le modele est 5008 ET le nb=5...

Ton exemple est donc correct et il fonctionne pour moi également!

Ce que j'avais (ajoute 1 au chiffre):
awk -F'|' '$2 ~ /'$voiture'/ {$4++} {OFS="|";print}' liste.txt >> listeT.txt

Ce que je voulais (ajoute x ou modifie le chiffre)
awk -F'|' '$2 ~ /'"$voiture"'/ {$4=$4+'$nb'} {OFS="|";print}' liste.txt
awk -F'|' '$2 ~ /'"$voiture"'/ {$4='$nb'} {OFS="|";print}' liste.txt

par exemple. Voilà tout simplement. J'avais mis en fait un == au départ qui ne marchait pas et j'étais passé à autre chose!

Merci
a+
Ajouter un commentaire
Ce document intitulé « Shell sed ou awk » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?