Récupérer des informations en amont d'un fichier
Fermé
dna.factory
Messages postés
25432
Date d'inscription
mercredi 18 avril 2007
Statut
Modérateur
Dernière intervention
19 décembre 2024
-
Modifié par dna.factory le 4/12/2012 à 16:29
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 6 déc. 2012 à 13:19
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 6 déc. 2012 à 13:19
A voir également:
- Récupérer des informations en amont d'un fichier
- Fichier rar - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment recuperer un message supprimé sur whatsapp - Guide
- Ouvrir un fichier .bin - Guide
4 réponses
dubcek
Messages postés
18757
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
19 décembre 2024
5 623
5 déc. 2012 à 08:40
5 déc. 2012 à 08:40
hello
avec awk
avec awk
$ awk 'NR==FNR {if($1 ~ /^C/)c=$1; else x[$1]=c; next} x[$1] {print $1 " - " x[$1]}' fichierB fichierA 11214180 - C8000466 11214450 - C8000350 11214451 - C8000350 11214452 - C8000350 $
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 419
4 déc. 2012 à 16:41
4 déc. 2012 à 16:41
Salut,
Ce que je veux faire, c'est pour chaque ligne du fichier A, je veux récupérer la (première) Valeur de C situé en amont dans le fichier.
Sauf que dans ton exemple, il n'y a que 2 valeurs de fichierA qui se retrouvent dans fichierB mais à la sortie tu as 4 couples dont 2 sorties de on ne sait où ???
C'est quoi la logique ?
Ce que je veux faire, c'est pour chaque ligne du fichier A, je veux récupérer la (première) Valeur de C situé en amont dans le fichier.
Sauf que dans ton exemple, il n'y a que 2 valeurs de fichierA qui se retrouvent dans fichierB mais à la sortie tu as 4 couples dont 2 sorties de on ne sait où ???
C'est quoi la logique ?
dna.factory
Messages postés
25432
Date d'inscription
mercredi 18 avril 2007
Statut
Modérateur
Dernière intervention
19 décembre 2024
1 613
4 déc. 2012 à 17:17
4 déc. 2012 à 17:17
pardon.. les deux 'fichiers' sont des extracts de plus gros fichiers.
le premier fait 21 lignes, et le second plus de 500
chaque ligne du fichier A se retrouve forcément dans le fichier B avec une ligne en C999999 située dessus.
C'est juste qu'on peut avoir des séquences comme les suivantes dans le fichier B
C8000466
11215322
11214180
11215322
11214180
11215322
11214180
11215322
11214180
11215322
11214180
11215322
11214180
C8000350
11214452
11214450
11214451
11214452
11214450
11214451
11214452
pour cette partie, le résultat que l'on souhaite sera
11214450 C8000350
11214451 C8000350
11214452 C8000350
11215322 C8000466
11214180 C8000466
le premier fait 21 lignes, et le second plus de 500
chaque ligne du fichier A se retrouve forcément dans le fichier B avec une ligne en C999999 située dessus.
C'est juste qu'on peut avoir des séquences comme les suivantes dans le fichier B
C8000466
11215322
11214180
11215322
11214180
11215322
11214180
11215322
11214180
11215322
11214180
11215322
11214180
C8000350
11214452
11214450
11214451
11214452
11214450
11214451
11214452
pour cette partie, le résultat que l'on souhaite sera
11214450 C8000350
11214451 C8000350
11214452 C8000350
11215322 C8000466
11214180 C8000466
dna.factory
Messages postés
25432
Date d'inscription
mercredi 18 avril 2007
Statut
Modérateur
Dernière intervention
19 décembre 2024
1 613
4 déc. 2012 à 17:19
4 déc. 2012 à 17:19
Ps : c'est de la prod en interne, pas un exercice : tous les coups sont permis, y compris les 'sales'
Seul le résultat compte.
Seul le résultat compte.
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 419
4 déc. 2012 à 17:25
4 déc. 2012 à 17:25
Bon en partant de tes exemples (fichA du 1er et fichB du 2nd), voilà ce que j'ai :
$ cat fichA 11214180 11214320 11214450 11214451 11214452 11214487 $ cat fichB C8000466 11215322 11214180 11215322 11214180 11215322 11214180 11215322 11214180 11215322 11214180 11215322 11214180 C8000350 11214452 11214450 11214451 11214452 11214450 11214451 11214452 $ cat foo.sh #! /bin/bash while read line do sed -n ':a;/^C/{h;:z;n;/^C/ba;/'"${line}"'/!bz;G;s/\n/ - /p;d}' fichB done < fichA $ ./foo.sh 11214180 - C8000466 11214450 - C8000350 11214451 - C8000350 11214452 - C8000350 $
dna.factory
Messages postés
25432
Date d'inscription
mercredi 18 avril 2007
Statut
Modérateur
Dernière intervention
19 décembre 2024
1 613
4 déc. 2012 à 17:49
4 déc. 2012 à 17:49
t'a fini avec les sed... à chaque fois j'y comprends rien :)
(je me doutais bien que ça allait être la solution)
bon, ça marche pas à premier vue
test.sh: line 4: Erreur de syntaxe près du symbole inattendu « done »
'est.sh: line 4: 'done < export
je regarde ça plus en détail pour voir si je peux pas trouver la réponse, et je reviens vers toi.
(je me doutais bien que ça allait être la solution)
bon, ça marche pas à premier vue
test.sh: line 4: Erreur de syntaxe près du symbole inattendu « done »
'est.sh: line 4: 'done < export
je regarde ça plus en détail pour voir si je peux pas trouver la réponse, et je reviens vers toi.
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 419
4 déc. 2012 à 17:53
4 déc. 2012 à 17:53
le 'bash' sera probablement un cygwin
D'où l'erreur sûrement ;-(
T'as pas un vrai système pour tester ? ;-))
Essaye déjà la syntaxe de sed toute seule sur le fichier sans passer par le script :
Ajuste la valeur "11214180" en fonction si besoin...
D'où l'erreur sûrement ;-(
T'as pas un vrai système pour tester ? ;-))
Essaye déjà la syntaxe de sed toute seule sur le fichier sans passer par le script :
sed -n ':a;/^C/{h;:z;n;/^C/ba;/11214180/!bz;G;s/\n/ - /p}' export
Ajuste la valeur "11214180" en fonction si besoin...
dna.factory
Messages postés
25432
Date d'inscription
mercredi 18 avril 2007
Statut
Modérateur
Dernière intervention
19 décembre 2024
1 613
4 déc. 2012 à 18:26
4 déc. 2012 à 18:26
j'ai une débian et un sco...
je testerais dessus, et je te tiendrais au courant...
je testerais dessus, et je te tiendrais au courant...
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 419
4 déc. 2012 à 18:32
4 déc. 2012 à 18:32
Faut faire gaffe aux formats des fichiers (fins de lignes).
Sur SCO la syntaxe de sed risque de ne pas passer, mieux vaut la mettre dans un fichier (script.sed) comme ça :
Et l'appeler comme suit :
J'en profite pour te mettre les explications de la syntaxe :
-n
Afficchage sur demande uniquement
:a
On pose une étiquette
/^C/ {
Si la ligne commence par "C" on applique ce qui se trouve entre les accolades
h
On la copie dans la mémoire secondaire
:z
On pose une nouvelle étiquette
n
On passe à la ligne suivante
/^C/ b a
Si la ligne commence par "C", on se branche à l'étiquette "a"
/'"${line}"'/ !b z
Si la ligne est différente du contenu de la variable on se branche à l'étiquette "z"
G
Si la variable correspond, on récupère le contenu de la mémoire secondaire et on on l'ajoute à notre espace de travail qui contient la ligne correspondant à la valeur de la variable
s/\n/ - /p
On substitue la fin de ligne par un espace suivi d'un tiret et d'un autre espace et on envoie le résultat sur la sortie standard.
}
Fin du regroupement de commandes
Sur SCO la syntaxe de sed risque de ne pas passer, mieux vaut la mettre dans un fichier (script.sed) comme ça :
#n :a /^C/ { h :z n /^C/ b a /11214180/ !b z G s/\n/ - /p }
Et l'appeler comme suit :
sed -f script.sed export
J'en profite pour te mettre les explications de la syntaxe :
-n
Afficchage sur demande uniquement
:a
On pose une étiquette
/^C/ {
Si la ligne commence par "C" on applique ce qui se trouve entre les accolades
h
On la copie dans la mémoire secondaire
:z
On pose une nouvelle étiquette
n
On passe à la ligne suivante
/^C/ b a
Si la ligne commence par "C", on se branche à l'étiquette "a"
/'"${line}"'/ !b z
Si la ligne est différente du contenu de la variable on se branche à l'étiquette "z"
G
Si la variable correspond, on récupère le contenu de la mémoire secondaire et on on l'ajoute à notre espace de travail qui contient la ligne correspondant à la valeur de la variable
s/\n/ - /p
On substitue la fin de ligne par un espace suivi d'un tiret et d'un autre espace et on envoie le résultat sur la sortie standard.
}
Fin du regroupement de commandes
dna.factory
Messages postés
25432
Date d'inscription
mercredi 18 avril 2007
Statut
Modérateur
Dernière intervention
19 décembre 2024
1 613
5 déc. 2012 à 11:21
5 déc. 2012 à 11:21
merci pour l'explication.
Dans l'urgence du résultat d'aujourd'hui, je vais prendre awk, mais il faut vraiment que je travaille sur sed donc je regarderais ça à tête reposée pour être capable de le faire
Dans l'urgence du résultat d'aujourd'hui, je vais prendre awk, mais il faut vraiment que je travaille sur sed donc je regarderais ça à tête reposée pour être capable de le faire
Modifié par dna.factory le 5/12/2012 à 11:23
(plus exactement, ça fait ce que j'ai demandé, maintenant, faut que je vérifie que ce que j'ai demandé c'est bien ce que je veux ^^ le grand problème des clients).
En tout cas merci à tous les deux, vous êtes là à chaque fois, l'un avec awk et l'autre avec sed ^^
edit, bah tiens, je le voulais en csv, mais je te dis de mettre un - au lieux d'un ;
t'inquiete, ça, je vais trouver ^^
Modifié par dubcek le 5/12/2012 à 12:38
6 déc. 2012 à 07:49