#1 Le 17/07/2012, à 13:04
- jedineofr
[RESOLU] [AWK] chercher dans des quotes
Bonjour à tous
Je chercher a extraire certaines informations de ce fichier test.txt :
inputFileName="TESTFICHIERENTRE2012.dat", fileId="FILEID1234567890123", status="OK", statusDate="2012/06/29", errorCode="0", outputFileName="TESTFICHIERSORTIE2012.dat"
A partir du fileID, je cherche à retrouver le fichier d'entrée.
J'ai essayé avec
#Préparation de awk
FileID="FILEID1234567890123" #FileID obtenu normalement par un autre moyen
fileIdTMP="fileId=\"${FileID}\"" #Concaténe FileID & reste du champ pour obtenir fileId="FILEID1234567890123"
#Commande awk
awk 'BEGIN {FS=", ";OFS=","} {if ($2 == "${fileIdTMP}") {print $1}}' test.txt > sortie.txt
Mais je n'obtiens rien !
Je me doute que awk n'aime pas les double quotes, que j'ai pourtant échappé : \"
Avez-vous une solution ?
Merci d'avance
Dernière modification par jedineofr (Le 18/07/2012, à 12:30)
Ubuntu 8.04 LTS -> Ubuntu 8.10 -> Ubuntu 9.04 -> Ubuntu 9.10 -> Ubuntu 10.04 LTS -> Lubuntu 14.04 > Ubuntu 14.04 > Ubuntu 16.04 LTS > Ubuntu 18.04 LTS
Asus ROG G551JW-DM379T (i7 4750HQ, GTX960M, Dd 1 To + SSD 24 Go, Windows 10 + Ubuntu)
Hors ligne
#2 Le 17/07/2012, à 14:05
- Hizoka
Re : [RESOLU] [AWK] chercher dans des quotes
Sans AWK et en FULL bash :
# On charge le fichier dans une variable
test=$(< test.txt)
# On vire les virgules
test=${test//,}
# Et on fait une eval de la variable
eval ${test}
# Et maintenant on a toutes les variables
echo ${fileId}
et avec sed :
sed 's/.*fileId="// ; s/".*//' test.txt
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#3 Le 17/07/2012, à 14:24
- credenhill
Re : [RESOLU] [AWK] chercher dans des quotes
hello
$ awk -F'"' '/fileId/ {print $4}' fichier
FILEID1234567890123
Hors ligne
#4 Le 17/07/2012, à 16:29
- jedineofr
Re : [RESOLU] [AWK] chercher dans des quotes
Déjà, merci pour vos réponses
Mais je pense avoir mal exprimé mon besoin et je m'en excuse
A partir du fileID que je connait (récupéré par une liste), je cherche à connaitre le nom du fichier d'entrée.
Ainsi un pseudo-algo serait
Pour chaque FileID ds ListeFileID.txt
nomFichierLog="log.txt"
nomFichierEntre=awk(FileId) $nomFichierLog #THE ligne qui me pose probléme :(
[...]
traitement(nomFichierEntre)
[...]
FinPour #La boucle tourne sur tous les fileID et effectue donc des traitement sur les fichiers en entrée
Ainsi avec le fichier log.txt qui ressemble à ca :
inputFileName="TESTFICHIERENTRE0132.dat", fileId="FILEID1234567890001", status="OK", statusDate="2012/06/29", errorCode="0", outputFileName="TESTFICHIERSORTIE0001.dat"
inputFileName="TESTFICHIERENTRE0589.dat", fileId="FILEID1234567890002", status="KO", statusDate="2012/06/30", errorCode="1", outputFileName="TESTFICHIERSORTIE0002.dat"
Je devrais obtenir
au 1er passage : nomFichierEntre=TESTFICHIERENTRE0132.dat
au 2iem passage : nomFichierEntre=TESTFICHIERENTRE0589.dat
En partant, par exemple, de la solution de credenhill, je teste avec :
#Je recupére un FileID contenu dans une liste
fileIdTMP=FILEID1234567890001 ou FILEID1234567890002 #Exemple pour tester le programme
#awk va me donner, grace au FileID, le nom du fichier en entrée
awk -F'"' '{if ($4 == "${fileIdTMP}") {print $2}}' log.txt
Ma ca fonctionne toujours pas
Dernière modification par jedineofr (Le 17/07/2012, à 16:33)
Ubuntu 8.04 LTS -> Ubuntu 8.10 -> Ubuntu 9.04 -> Ubuntu 9.10 -> Ubuntu 10.04 LTS -> Lubuntu 14.04 > Ubuntu 14.04 > Ubuntu 16.04 LTS > Ubuntu 18.04 LTS
Asus ROG G551JW-DM379T (i7 4750HQ, GTX960M, Dd 1 To + SSD 24 Go, Windows 10 + Ubuntu)
Hors ligne
#5 Le 17/07/2012, à 17:00
- Haleth
Re : [RESOLU] [AWK] chercher dans des quotes
Ok
alex@jack:~$ cat test
inputFileName="TESTFICHIERENTRE0132.dat", fileId="FILEID1234567890001", status="OK", statusDate="2012/06/29", errorCode="0", outputFileName="TESTFICHIERSORTIE0001.dat"
inputFileName="TESTFICHIERENTRE0589.dat", fileId="FILEID1234567890002", status="KO", statusDate="2012/06/30", errorCode="1", outputFileName="TESTFICHIERSORTIE0002.dat"
alex@jack:~$ cat fileid
FILEID1234567890001
FILEID1234567890002
alex@jack:~$ cat test.sh
#!/bin/bash
while read line
do
grep "$line" test | awk -F'"' '/inputFileName/ {print $2}'
done < fileid
alex@jack:~$ ./test.sh
TESTFICHIERENTRE0132.dat
TESTFICHIERENTRE0589.dat
Ubuntu is an ancien African word which means "I can't configure Debian"
Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.
Hors ligne
#6 Le 18/07/2012, à 07:57
- credenhill
Re : [RESOLU] [AWK] chercher dans des quotes
hello
$ awk -F'"' 'NF<2 {x[$1]=$1; next} x[$4] {print $2}' fileid log.txt
TESTFICHIERENTRE0132.dat
TESTFICHIERENTRE0589.dat
$
Hors ligne
#7 Le 18/07/2012, à 10:12
- Postmortem
Re : [RESOLU] [AWK] chercher dans des quotes
Salut,
hello
$ awk -F'"' 'NF<2 {x[$1]=$1; next} x[$4] {print $2}' fileid log.txt TESTFICHIERENTRE0132.dat TESTFICHIERENTRE0589.dat $
J'étais entrain de me demander comment marchait ta commande... Puis j'ai vu que t'avais mis les 2 fichiers en entrée de awk !!
C'est carrément bien vu je trouve, pas de boucle et donc un seul awk, je note ça dans un coin ! Merki !
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#8 Le 18/07/2012, à 10:15
- credenhill
Re : [RESOLU] [AWK] chercher dans des quotes
le NF<2 permet de savoir si on traite le fichier fileid ou l'autre
Hors ligne
#9 Le 18/07/2012, à 10:27
- Postmortem
Re : [RESOLU] [AWK] chercher dans des quotes
le NF<2 permet de savoir si on traite le fichier fileid ou l'autre
J'avais bien compris mais merci ! C'est juste qu'au début, je n'avais pas fait attention que tu avais mis les 2 fichiers en entrée de awk donc je pigeais pas.
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#10 Le 18/07/2012, à 12:30
- jedineofr
Re : [RESOLU] [AWK] chercher dans des quotes
Une grand MERCI à vous tous
J'ai testé ta solution Haleth, elle est simple et efficace. Mais je vais quand même jeter un oeil sur ta solution, credenhill
Encore merci
Ubuntu 8.04 LTS -> Ubuntu 8.10 -> Ubuntu 9.04 -> Ubuntu 9.10 -> Ubuntu 10.04 LTS -> Lubuntu 14.04 > Ubuntu 14.04 > Ubuntu 16.04 LTS > Ubuntu 18.04 LTS
Asus ROG G551JW-DM379T (i7 4750HQ, GTX960M, Dd 1 To + SSD 24 Go, Windows 10 + Ubuntu)
Hors ligne