Parser deux fichiers dans script sh [Résolu/Fermé]

Messages postés
558
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
19 juin 2019
-
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 

3 réponses

Messages postés
1434
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
14 octobre 2019
69
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.
Utilisateur anonyme -
tu m'étonnes que ça va prendre des plombes avec toutes ces commandes externes !
Messages postés
558
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
19 juin 2019
16
0
Merci
Merci Exileur.

Je vais m'appuyer sur ton exemple.
0
Merci
salut,

une seule commande pour faire ce qui est demandé :
join
Exileur
Messages postés
1434
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
14 octobre 2019
69 > Utilisateur anonyme -
Manque le site ^^
Utilisateur anonyme > Exileur
Messages postés
1434
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
14 octobre 2019
-
corrigé
Exileur
Messages postés
1434
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
14 octobre 2019
69 > zipe31
Messages postés
37210
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
15 octobre 2019
-
Si les deux fichiers ne contiennent pas le méme nombre de ligne, ton code fonctionnerai ?
Exileur
Messages postés
1434
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
14 octobre 2019
69 -
Merci pour la commande, je ne l'a connaissais pas !
Je vais voir ce qui est faisable avec !

En attendant, ma methode fonctionne :)
zipe31
Messages postés
37210
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
15 octobre 2019
4095 > Exileur
Messages postés
1434
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
14 octobre 2019
-
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).