A voir également:
- Récupérer des informations en amont d'un fichier
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Fichier .dat - Guide
4 réponses
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 $
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 ?
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
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.
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 $
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.
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...
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
(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 ^^