Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2204 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [LINUX] Extraire les lignes d'un fichier à partir d'un champ avec grep

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[LINUX] Extraire les lignes d'un fichier à partir d'un champ avec grep

n°1449241
pwd2004
Posté le 17-05-2020 à 17:38:41  profilanswer
 

Bonjour,
 
Je voudrais extraire des lignes d'un fichier en ne récupérant que celles dont les données du 3ème champ (avec un séparateur "|" ) = toto
 
par exemple j'ai:
 
titi|toto|tata|tutu
titi|tata|tete|tyty
tete|tyty|tata|toto
 
 
Je voudrais récupérer les lignes dont le 3ème champ = tata (soit la 1ère ligne et la 3ème ligne)
si je fais un grep sur "|tata|" il va me ramener les 3 lignes...
J'ai essayé avec une commande awk mais je n'arrive qu'à extraire le champ en question alors qu'il me faut la ligne complete...
 
quelqu'un pourrait m'aider svp ?
 
Merci :)

mood
Publicité
Posté le 17-05-2020 à 17:38:41  profilanswer
 

n°1449242
rat de com​bat
attention rongeur méchant!
Posté le 17-05-2020 à 18:29:53  profilanswer
 

Un bout de Perl ça t'irait?

n°1449243
pwd2004
Posté le 17-05-2020 à 18:32:00  profilanswer
 

rat de combat a écrit :

Un bout de Perl ça t'irait?


 
je n'y connais rien en perl mais... of course !  :)  :)

n°1449249
kajoux
Posté le 17-05-2020 à 22:04:47  profilanswer
 

awk -F'|' '$3 == "tata"' fichier


 :o

n°1449250
pwd2004
Posté le 17-05-2020 à 22:45:08  profilanswer
 

kajoux a écrit :

awk -F'|' '$3 == "tata"' fichier


 :o


 
Nickel !!!  :)  :)  :)  
Merci Kajoux
 
Dernière question, si je veux récupérer tous les tata du 3ème champ ainsi que les toto du meme champ, je peux l'intégrer à une meme commande ?
je peux toujours faire :

awk -F'|' '$3 == "tata"' fichier > fichier.out  
puis
awk -F'|' '$3 == "toto"' fichier >> fichier.out


mais bon, c'est pas très propre...

n°1449252
kajoux
Posté le 17-05-2020 à 23:03:05  profilanswer
 

awk -F'|' '$3 ~ "^(tata|toto)$"' fichier > fichier.out


 :)

n°1449253
pwd2004
Posté le 17-05-2020 à 23:15:20  profilanswer
 

kajoux a écrit :

awk -F'|' '$3 ~ "^(tata|toto)$"' fichier > fichier.out


 :)


 
Respect !
 :jap:

n°1449286
pwd2004
Posté le 18-05-2020 à 14:49:18  profilanswer
 

kajoux a écrit :

awk -F'|' '$3 ~ "^(tata|toto)$"' fichier > fichier.out


 :)


 
En fait j'aurais une dernière petite question.... :/
la commande passe très bien quand je la saisie telle quelle mais j'ai besoin de 'variabiliser' toto et tata.
 
j'ai donc:
variable1=toto
variable2=tata
 
et quand je lance mon  
 

cat fichier | awk -F'|' '$3 ~ "^(${variable1}|${variable2})$"' > fichier.out


 
évidemment c'est la chaine de caractère "${variable1}" et "${variable2}" qu'il va chercher et non pas le contenu de ces variables...
J'ai essayé d'y ajouter un "\" devant le $ mais c'est pire...
 
une solution que j'ai trouvé c'est de faire un echo de la commande et de la rediriger vers un fichier, puis de l'executer. Pour le coup ce n'est vraiment pas propre...  :(  
J'ai beau chercher je ne trouve pas, tu aurais une solution ??


Message édité par pwd2004 le 18-05-2020 à 14:53:26
n°1449289
kajoux
Posté le 18-05-2020 à 15:10:30  profilanswer
 

Il y a plusieurs solutions pour ça, mais pour éviter de trop jouer avec les doubles / simples quotes, tu peux passer les variables à awk :

awk -F'|' -v"v1=$variable1" -v"v2=$variable2" '$3 ~ "^("v1"|"v2" )$"' fichier > fichier.out


(le cat est inutile : useless use of cat, ou UUOC)
 
PS : je sais pas pourquoi, le forum rajoute un espace après "v2" au-dessus, et c'est pareil avec des balises code :

Code :
  1. awk -F'|' -v"v1=$variable1" -v"v2=$variable2" '$3 ~ "^("v1"|"v2" )$"' fichier > fichier.out


Et même sans balises :
awk -F'|' -v"v1=$variable1" -v"v2=$variable2" '$3 ~ "^("v1"|"v2" )$"' fichier > fichier.out
 
Il ne faut pas d'espace, sinon ça ne marche plus.
 
Voilà une astuce pour que ça ne rajoute pas d'espace : mettre le double quote en gras, le tout dans des balises code :

Code :
  1. awk -F'|' -v"v1=$variable1" -v"v2=$variable2" '$3 ~ "^("v1"|"v2")$"' fichier > fichier.out


 [:la chancla:1]


Message édité par kajoux le 18-05-2020 à 15:38:49
n°1449291
pwd2004
Posté le 18-05-2020 à 15:49:42  profilanswer
 

J'allais répondre mais tu m'as devancé: effectivement avec des quotes ca marche beaucoup mieux :D
J'ai trouvé ca juste après avoir posté mon dernier message, et après avoir galéré toute la fin de matinée avec....
 
Oui, le cat c'est une mauvaise habitude que j'ai gardé quand j'ai commencé à scripter il y a quelques années. Et c'est plus lisible sans.
Du coup comme je définie mes variables en début de mon script, indépendamment de cette fonction, je ne les redéfinie pas dans le awk, j'ai juste ajouté une simple quote et ca marche :)
un grand merci pour ta réponse.
 
J'ai une toute dernière question, mais promis juré c'est vraiment la dernière  :lol: :
une de mes variable était  

variable3=tot*


soit pour récupérer toutes les données qui commencent par tot (disons toto, tota et toti).
Là par contre ca ne fonctionne pas. Il faut que ce soit la valeur exact du champ. Meme si je mets

variable3=tot


il ne prendra ni toto ni tota ni toti
 
Tu aurais une idée ?  
 

mood
Publicité
Posté le 18-05-2020 à 15:49:42  profilanswer
 

n°1449292
kajoux
Posté le 18-05-2020 à 16:00:22  profilanswer
 

Ça n'est pas tot*, mais tot.* (regex, pas globbing).
Donc :

Code :
  1. variable3='tot.*'
  2. awk -F'|' -v"v=$variable3" '$3 ~ "^("v")$"' fichier > fichier.out


Mais tu peux plus simplement virer le $ de la regex, et ne mettre que tot dans ta variable :

Code :
  1. variable3='tot'
  2. awk -F'|' -v"v=$variable3" '$3 ~ "^("v")"' fichier > fichier.out

n°1449295
pwd2004
Posté le 18-05-2020 à 16:40:53  profilanswer
 

il me reste deux ou trois trucs à apprendre en shell  :lol:  
 
Merci Kajoux, tout fonctionne nickel maintenant !
 
 :jap:  :jap:  
 

n°1449297
kajoux
Posté le 18-05-2020 à 16:51:16  profilanswer
 

;)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [LINUX] Extraire les lignes d'un fichier à partir d'un champ avec grep

 

Sujets relatifs
Installer Linux sans le mot de passe BIOS[Noob] java et Linux...
Retrouver dans le code linux un paramètre issu de sysctlLinux Live et monter disques SSD NTFS
Clé USB Linux Live refuse de booterLinux MInt 19.3. RenameMyTVSeries ne fonctionne pas
MAO sous Linux (compatible Cakewalk Sonar)Le fichier texte xxx semble être un script exécutable.
Machine linux : gérer partage/permissions depuis windows (samba/sssd)[(Sim) Racing @ Linux ] ... le topic qui en fait des caisses (ou pas)
Plus de sujets relatifs à : [LINUX] Extraire les lignes d'un fichier à partir d'un champ avec grep


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR