Question AWK recherche

Résolu/Fermé
Signaler
Messages postés
14
Date d'inscription
mardi 24 mars 2015
Statut
Membre
Dernière intervention
5 juillet 2016
-
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
-
Bonjour,
J'ai un dossier qui possède de nombreuses lignes. Certaines que je veux et certaines que je ne veux pas. Cependant, certaines de ces lignes n'apparaissent pas toujours avec un retour chariot et donc coupent les lignes en écriture. Par exemple:
$INGGA,100712.00,5617.13610,N,05223.63366,W,2,14,00.7,019.724,M,0.0,M,0.0,0000*4D
$INVTG,337.16,T,335.86,M,012.$PADCP,27,20140813,100708.85
Le fait est que j'aimerais pouvoir reprendre ce qui suit "$PADCP" mais retirer la ligne qu'il coupe.
Est-ce possible de le repérer? (car il vient toujours de manière aléatoire)
Merci de votre aide.

2 réponses

Messages postés
14
Date d'inscription
mardi 24 mars 2015
Statut
Membre
Dernière intervention
5 juillet 2016

J'ai essayé ce code
awk -F, '{if ($0 ~ "PADCP" && $0 ~ "CADCP") print $0}' | awk -F "" '{for (i=NF-36;i<=NF;i++) printf ("%s",$i);printf "\n"}'
en pensant que ce qui suivait "$PADCP" était fixe mais ça ne l'est pas alors ça ne marche pas...
0
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 586
Salut,

Pour bien comprendre...
tu as ça :
$INGGA,100712.00,5617.13610,N,05223.63366,W,2,14,00.7,019.724,M,0.0,M,0.0,0000*4D
$INVTG,337.16,T,335.86,M,012.$PADCP,27,20140813,100708.85

Et tu veux quoi en sortie ?
0
Oui il est bien sous cette forme et je veux :
$INGGA,100712.00,5617.13610,N,05223.63366,W,2,14,00.7,019.724,M,0.0,M,0.0,0000*4D
$PADCP,27,20140813,100708.85
0
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 586 > marcloarec
$ cat plop 
$INGGA,100712.00,5617.13610,N,05223.63366,W,2,14,00.7,019.724,M,0.0,M,0.0,0000*4D
$INVTG,337.16,T,335.86,M,012.$PADCP,27,20140813,100708.85

$ sed 's/.*\($PADCP\)/\1/' plop
$INGGA,100712.00,5617.13610,N,05223.63366,W,2,14,00.7,019.724,M,0.0,M,0.0,0000*4D
$PADCP,27,20140813,100708.85


Si c'est ce que tu veux et pour que ce soit effectif dans le fichier (là la suppression ne se fait qu'à l'affichage et non dans le fichier), il te suffira de rajouter l'option "-i.bak" à sed :
sed -i.bak 's/.*\($PADCP\)/\1/' fichier

Ça modifie directement le fichier et ça fait une sauvegarde avec l'option .bak
0
Messages postés
14
Date d'inscription
mardi 24 mars 2015
Statut
Membre
Dernière intervention
5 juillet 2016

C'est exactement ce qu'il me faut! :)
Comme je suis assez novice par contre, si j'ai un fichier avec des milliers de lignes qui se suivent comme dans mon exemple, est-ce que cette commande va reconnaitre tous les $PADCP dans le fichier?
Et à quoi sert exactement le plop?
En tout les cas merci beaucoup
0
Messages postés
14
Date d'inscription
mardi 24 mars 2015
Statut
Membre
Dernière intervention
5 juillet 2016

Je viens d'essayer, ça marche super bien, je retire évidemment ma question sur "plop"... Désolé
En revanche je suis assez curieux donc si l'envie te prend de m'expliquer comment ce code marche je suis preneur.
Merci beaucoup zipe31
0
Messages postés
22129
Date d'inscription
mercredi 18 avril 2007
Statut
Contributeur
Dernière intervention
14 janvier 2022
1 680
Si j'ai bien compris (zipe confirmera), ça remplace ( s/avant/après/ ) toutes les chaines composées de n'importe quoi suivit par $PADCP par 'juste' $PADCP
comme y'a pas le g à la fin, si y'a deux fois $PADCP dans une ligne, ça ne fait le traitement que pour le premier.
0