Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 25/08/2017, à 10: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 ? smile

Dernière modification par Beuhlet_Reseau (Le 25/08/2017, à 10:50)


L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).

Hors ligne

#2 Le 25/08/2017, à 10: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, à 11: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, à 11: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, à 11: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


Archlinux sur Xiaomi Air 13

Hors ligne

#6 Le 25/08/2017, à 13: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, à 13: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, à 17:33)

Hors ligne

#8 Le 25/08/2017, à 14: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, à 16: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, à 17:08)


L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).

Hors ligne

#10 Le 25/08/2017, à 17: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, à 17:32)

Hors ligne

#11 Le 25/08/2017, à 17: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, à 17:27)


L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).

Hors ligne

#12 Le 25/08/2017, à 17: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, à 17: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, à 19:24)

Hors ligne