Récupérer des informations en amont d'un fichier

Fermé
dna.factory Messages postés 25233 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 19 septembre 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
Bonjour,

j'ai essayé de chercher un peu pour mon problème, j'ai bien trouvé un problème approchant, mais je préfere repartir de zéro.
le titre n'est pas forcément explicite, donc j'explique ma situation
j'ai un (extraction de ) fichier contenant deux types d'informations
soit des C[0-9]\{7\} soit des [0-9]\{\8}
chaque valeur pouvant être présente plusieurs fois.
d'un autre coté, j'ai un fichier contenant uniquement les [0-9]\{8\} (en sort|uniq)

fichier A
11214180
11214320
11214450
11214451
11214452
11214487

fichier B
C8000098
11214554
C8000098
11214554
C8000098
C8000130
11215012
C8000350
11214450
11214451
C8000098
11214554
C8000098


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 la ligne C n'est pas toujours directement au dessus de la ligne à 8 chiffre, ce serait trop facile)


résultat (la mise en forme est libre)

11214554 - C8000098
11215012 - C8000130
11214450 - C8000350
11214451 - C8000350

Je l'ai sur le bout des doigts, malheureusement, ce n'est pas mon boulot principal, et je peux pas me permettre de perdre ce qu'il reste de l'après midi à faire ça...
(même si en soit ça me dérangerais pas.)

le 'bash' sera probablement un cygwin (émulation linux).

Stop failing the turing test !
A voir également:

4 réponses

dubcek Messages postés 18744 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 4 septembre 2024 5 617
5 déc. 2012 à 08:40
hello
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
$ 
1
dna.factory Messages postés 25233 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 19 septembre 2024 1 612
Modifié par dna.factory le 5/12/2012 à 11:23
Ca a l'air de marcher.

(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 ^^
0
dubcek Messages postés 18744 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 4 septembre 2024 5 617
Modifié par dubcek le 5/12/2012 à 12:38
c'est le client qui paye, il a tout les droits ...:-)
0
dna.factory Messages postés 25233 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 19 septembre 2024 1 612
6 déc. 2012 à 07:49
ma 'cliente', qui est ma collège et accessoirement ma colocataire te remercie énormément
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
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 ?
0
dna.factory Messages postés 25233 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 19 septembre 2024 1 612
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
0
dna.factory Messages postés 25233 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 19 septembre 2024 1 612
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.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
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

$

0
dna.factory Messages postés 25233 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 19 septembre 2024 1 612
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.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
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 :

sed -n ':a;/^C/{h;:z;n;/^C/ba;/11214180/!bz;G;s/\n/ - /p}' export

Ajuste la valeur "11214180" en fonction si besoin...
0
dna.factory Messages postés 25233 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 19 septembre 2024 1 612
4 déc. 2012 à 18:26
j'ai une débian et un sco...
je testerais dessus, et je te tiendrais au courant...
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
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 :

#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
0
dna.factory Messages postés 25233 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 19 septembre 2024 1 612
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
0