Menu

Parser deux fichiers dans script sh [Résolu]

pcsystemd 540 Messages postés dimanche 27 novembre 2005Date d'inscription 17 juillet 2018 Dernière intervention - 16 mai 2018 à 11:34 - Dernière réponse : lapiel 36 Messages postés jeudi 17 mai 2018Date d'inscription 10 août 2018 Dernière intervention
- 17 mai 2018 à 21:53
Bonjour,

Bon j'ai besoin d'un coup de pouce si possible s'il vous plait!

Je vous explique.

J'ai deux fichiers comme suit :

Fichier 1

2543|Toto|PARIS|www.mondomaine.fr
354|Titi|MARSEILLES|www.autredomaine.com
3486|Tutu|BORDEAUX|www.monsite.com
etc..


Fichier 2


Tutu|3486|Site|www.monsite.com|2317|1508|983|0|3375|299|946|823
Titi|354|Site|www.autredomaine.com|705|379|229|0|620|38|129|113
Toto|2543|Site|www.mondomaine.fr|5274|3646|1637|0|2809|2694|143|135
etc..


Je voudrais parser les deux fichiers pour en avoir qu'un seul avec comme résultat :

Fichier 3


354|Titi|MARSEILLES|www.autredomaine.com|705|379
3486|Tutu|BORDEAUX|www.monsite.com|2317|1508
2543|Toto|PARIS|www.mondomaine.fr|5274|3646


Donc c'est les données du fichier 1 + les données du fichier 2 (champs n° 5 et 6 uniquement).

Il est nécessaire pour cela que les champs 1,2 et 4 du fichier 1 correspondent aux champs 2,1,4 du fichier 2.

J'ai essayé d'être le plus clair possible.

Merci d'avance




Afficher la suite 

Votre réponse

13 réponses

Exileur 1318 Messages postés mercredi 31 août 2011Date d'inscription 7 août 2018 Dernière intervention - Modifié par Exileur le 17/05/2018 à 11:29
0
Merci
Salut,

Bon, c'est dégeullasse mais ça a l'air de fonctionné.
edit : Par dégeullase, je veux dire pas opti, executer un script comme celui-ci sur des fichiers de plusieurs centaine de Mo serait relativement long..

1) Mettre en forme le fichier2 pour quil ressemble au premier.
2) lire le fichier1 ligne par ligne, et chercher une correspondance dans notre fichier mise en forme
3) Si une correspondance est trouvée, on remplace "site" dans notre fichier mise en forme, par le site reel (marseille, bordeaux etc...).

!! Ne pas inversé fichier1 et fichier2 depuis ton exemple.

#!/bin/bash
# doit.sh
#
test -n "$3" || { echo "$0 <fichier_1> <fichier_2> <fichier_output>"; exit 1; }

RND1="$(( ( RANDOM % 100000 )  + 10000 ))"
RND2="$(( ( RANDOM % 100000 )  + 10000 ))"
touch /tmp/${RND1}
touch /tmp/${RND2}

while read -r line
do
    echo $line | awk -F '\\|' '{ print $2 "|" $1 "|" "site" "|" $4 "|" $5 "|" $6 }' >> /tmp/${RND1}
done < $2

cat "$1" |while read -r line
do
 site=`echo $line |  awk -F '\\|' '{ printf $3 }'`

 tmp=`echo $line | awk -F '\\|' '{ print $1 "|" $2 "|" "site" "|" $4 }'` 
 count=$(cat "/tmp/${RND1}" |grep "$tmp" |wc -l)

 if [[ $count = 1 ]]
 then
  cat "/tmp/${RND1}" |grep "$tmp" |awk -v site="$site" -F '\\|' '{ print $1 "|" $2 "|" site "|" $4 "|" $5 "|" $6 }' >> /tmp/${RND2}
 fi
done

/bin/cp "/tmp/${RND2}" "$3"
/bin/rm "/tmp/${RND1}"
/bin/rm "/tmp/${RND2}"
 


A plus
N'oubliez pas de marquez votre post comme résolut lorsque vous avez eu les réponses à vos questions...
Au royaume des aveugles, les borgnes sont rois.
lapiel 36 Messages postés jeudi 17 mai 2018Date d'inscription 10 août 2018 Dernière intervention - 17 mai 2018 à 16:38
tu m'étonnes que ça va prendre des plombes avec toutes ces commandes externes !
Commenter la réponse de Exileur
pcsystemd 540 Messages postés dimanche 27 novembre 2005Date d'inscription 17 juillet 2018 Dernière intervention - 17 mai 2018 à 15:03
0
Merci
Merci Exileur.

Je vais m'appuyer sur ton exemple.
Commenter la réponse de pcsystemd
lapiel 36 Messages postés jeudi 17 mai 2018Date d'inscription 10 août 2018 Dernière intervention - 17 mai 2018 à 16:38
0
Merci
salut,

une seule commande pour faire ce qui est demandé :
join
Exileur 1318 Messages postés mercredi 31 août 2011Date d'inscription 7 août 2018 Dernière intervention > lapiel 36 Messages postés jeudi 17 mai 2018Date d'inscription 10 août 2018 Dernière intervention - 17 mai 2018 à 21:48
Manque le site ^^
lapiel 36 Messages postés jeudi 17 mai 2018Date d'inscription 10 août 2018 Dernière intervention > Exileur 1318 Messages postés mercredi 31 août 2011Date d'inscription 7 août 2018 Dernière intervention - 17 mai 2018 à 21:53
corrigé
Exileur 1318 Messages postés mercredi 31 août 2011Date d'inscription 7 août 2018 Dernière intervention > zipe31 35736 Messages postés dimanche 7 novembre 2010Date d'inscriptionContributeurStatut 12 août 2018 Dernière intervention - 17 mai 2018 à 21:50
Si les deux fichiers ne contiennent pas le méme nombre de ligne, ton code fonctionnerai ?
Exileur 1318 Messages postés mercredi 31 août 2011Date d'inscription 7 août 2018 Dernière intervention - 17 mai 2018 à 17:49
Merci pour la commande, je ne l'a connaissais pas !
Je vais voir ce qui est faisable avec !

En attendant, ma methode fonctionne :)
zipe31 35736 Messages postés dimanche 7 novembre 2010Date d'inscriptionContributeurStatut 12 août 2018 Dernière intervention > Exileur 1318 Messages postés mercredi 31 août 2011Date d'inscription 7 août 2018 Dernière intervention - 17 mai 2018 à 17:55
Salut,

C'est faisable avec
join
qu'à certaines conditions, notamment s'il n'y a qu'un seul champ commun à prendre en compte, mais ce n'est pas le cas de notre ami (3 champs en commun pour valider la jointure).
Commenter la réponse de lapiel