#1 Le 25/08/2017, à 09:49
- Beuhlet_Reseau
Récupérér la première chaine de caractère plusieurs lignes
Hello,
Je suis à la recherche d'un bout de commande avant d'effectuer un traitement sur toutes les lignes de mon fichier en l'occurrence sur le champ n°6.
xxxx|yyyy|123|Request below ok |rrrr|aaaaa
xxxx|yyyy|123|Response below ok |rrrr|aaaaa
Vous l'aurez compris je cherche à récupérer par exemple seulement les mots Request, Respons du champ en question.
J'utilise déjà ma commande awk, mais je ne trouve pas comment réaliser cela avec cette commande :
gawk 'BEGIN{FS=OFS="|"}....*
La complexité pour moi réside dans le fait que j'utilise déjà le séparateur de ligne donc je ne sais pas comment lui demander d'interpréter un truc du genre :
{if($6)$6=(-F" " print $1)} Vous voyez un peu mon souci ?
Dernière modification par Beuhlet_Reseau (Le 25/08/2017, à 09:50)
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#2 Le 25/08/2017, à 09:59
- Vobul
Re : Récupérér la première chaine de caractère plusieurs lignes
T'expliques pas très bien. Mais si tu veux récupérer seulement les mots request et response, tu peux piper une deuxième fois:
echo "xxxx|yyyy|123|Request below ok |rrrr|aaaaa"|awk -F '|' '{print $4}'|awk '{print $1}'
Vobul
Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.
RTFM
Hors ligne
#3 Le 25/08/2017, à 10:03
- Beuhlet_Reseau
Re : Récupérér la première chaine de caractère plusieurs lignes
Désolé je me suis mal expliqué, voici le résultat attendu :
xxxx|yyyy|123|Request below ok |rrrr|aaaaa
xxxx|yyyy|123|Response below ok |rrrr|aaaaa
xxxx|yyyy|123|Request|rrrr|aaaaa
xxxx|yyyy|123|Response|rrrr|aaaaa
Ta commande j'y ai pensé malheureusement elle me "tue" tout le reste. Je veux garder ma ligne intact et ne changer que ce champs.
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#4 Le 25/08/2017, à 10:24
- sergeG75018
Re : Récupérér la première chaine de caractère plusieurs lignes
Bonjour.
Pourquoi utiliser awk si tu veux supprimer " below ok ".
un sed suffit.
Ironie, sarcasme ou cynisme? Je ne sais plus
Hors ligne
#5 Le 25/08/2017, à 10:35
- k3c
Re : Récupérér la première chaine de caractère plusieurs lignes
de manière générale,
awk --> rechercher une information
sed --> modifier une information dans un fichier
ensuite, awk permet aussi de modifier, sed permet aussi de rechercher
Debian 12 sur Thinkpad reconditionné
Hors ligne
#6 Le 25/08/2017, à 12:07
- credenhill
Re : Récupérér la première chaine de caractère plusieurs lignes
hello
$ cat fichier
xxxx|yyyy|123|Request below ok |rrrr|aaaaa
xxxx|yyyy|123|Response below ok |rrrr|aaaaa
$ awk 'BEGIN{FS=OFS="|"} {sub(" .*", "", $4); print}' fichier
xxxx|yyyy|123|Request|rrrr|aaaaa
xxxx|yyyy|123|Response|rrrr|aaaaa
Hors ligne
#7 Le 25/08/2017, à 12:45
- pingouinux
Re : Récupérér la première chaine de caractère plusieurs lignes
Bonjour,
Un peu plus compliqué, avec sed :
sed -r 's/(([^|]*\|){3})([^| ]+)[^|]*(\|)/\1\3\4/' fichier
Correction
Dernière modification par pingouinux (Le 25/08/2017, à 16:33)
Hors ligne
#8 Le 25/08/2017, à 13:04
- Watael
Re : Récupérér la première chaine de caractère plusieurs lignes
salut,
autrement avec awk (parce que Beuhlet_Reseau a d'autres traitements avec awk) :
awk 'BEGIN{FS=OFS="|"}{if($4){split($4,ar," "); $4=ar[1]}}1'
on ne pipe pas awk vers awk !!!
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 25/08/2017, à 15:59
- Beuhlet_Reseau
Re : Récupérér la première chaine de caractère plusieurs lignes
Salut et merci pour vos retours messieurs.
En effet, j'étais plutot partis sur du awk pour enfiler dans la même commande tous mes traitements.
Du coup, entre temps j'ai pu remarquer des anomalies (pas énorme une vingtaines sur des milliers de lignes)
Rappel de la commande utilisé : awk 'BEGIN{FS=OFS="|"}{if($4){split($4,ar," "); $4=ar[1]}}1'
Voici quelques résultats plutôt inattendu (j'ai coupé sur la colonne) :
|Request:you|
|Request:|
|Request,|
|Respons:|
|Info|
|Respons,0|
|Request,|
... J'en étais arrivé plus ou moins à ce stade. A la limite les seules choses dérangeantes sont les caractères en fin comme "," , ":" , ":you"
Je suis pas expert mais j'ai l'impression que l'on ne pourra pas obtenir mieux à cause de ces caractères
Dernière modification par Beuhlet_Reseau (Le 25/08/2017, à 16:08)
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#10 Le 25/08/2017, à 16:20
- pingouinux
Re : Récupérér la première chaine de caractère plusieurs lignes
En adaptant ma commande sed en #7 :
sed -r 's/(([^|]*\|){3})([^| :,]+)[^|]*\|/\1\3|/' fichier
Je n'ai pas regardé, mais ce doit être possible aussi avec awk.
Correction
Dernière modification par pingouinux (Le 25/08/2017, à 16:32)
Hors ligne
#11 Le 25/08/2017, à 16:27
- Beuhlet_Reseau
Re : Récupérér la première chaine de caractère plusieurs lignes
C'est fou cette maîtrise de SED j'ai déjà du mal à lire ta commande que tu arrives à l'améliorer à la volée.!
Ta commande ne fonctionnait qu'à moitié mais en changeant juste une chose :
sed -r 's/(([^|]*\|){3})([^| :,]+)[^|]+\|/\1\3|/' fichier
en
sed -r 's/(([^|]*\|){4})([^| :,]+)[^|]+\|/\1\3|/' fichier
Je ne comprends pas pourquoi mais le résultat en changeant 3 en 4 et parfait (en tout cas j'ai l'impression)
Dernière modification par Beuhlet_Reseau (Le 25/08/2017, à 16:27)
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#12 Le 25/08/2017, à 16:33
- Watael
Re : Récupérér la première chaine de caractère plusieurs lignes
le troisième argument de la fonction split est une regex.
tu peux remplacer " " par "[ ,:]".
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#13 Le 25/08/2017, à 16:35
- pingouinux
Re : Récupérér la première chaine de caractère plusieurs lignes
J'ai corrigé mes commandes en #7 et #10 (il y avait un problème quand le 4ème champ ne contenait pas de caractères spéciaux).
Dernière modification par pingouinux (Le 25/08/2017, à 18:24)
Hors ligne