Menu

Parser deux fichiers dans script sh [Résolu]

Messages postés
547
Date d'inscription
dimanche 27 novembre 2005
Dernière intervention
19 décembre 2018
-
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

3 réponses

Messages postés
1333
Date d'inscription
mercredi 31 août 2011
Dernière intervention
13 octobre 2018
91
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 !
Commenter la réponse de Exileur
Messages postés
547
Date d'inscription
dimanche 27 novembre 2005
Dernière intervention
19 décembre 2018
28
0
Merci
Merci Exileur.

Je vais m'appuyer sur ton exemple.
Commenter la réponse de pcsystemd
0
Merci
salut,

une seule commande pour faire ce qui est demandé :
join
Exileur
Messages postés
1333
Date d'inscription
mercredi 31 août 2011
Dernière intervention
13 octobre 2018
91 > Utilisateur anonyme -
Manque le site ^^
Utilisateur anonyme > Exileur
Messages postés
1333
Date d'inscription
mercredi 31 août 2011
Dernière intervention
13 octobre 2018
-
corrigé
Exileur
Messages postés
1333
Date d'inscription
mercredi 31 août 2011
Dernière intervention
13 octobre 2018
91 > zipe31
Messages postés
36088
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
20 janvier 2019
-
Si les deux fichiers ne contiennent pas le méme nombre de ligne, ton code fonctionnerai ?
Exileur
Messages postés
1333
Date d'inscription
mercredi 31 août 2011
Dernière intervention
13 octobre 2018
91 -
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
36088
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
20 janvier 2019
5714 > Exileur
Messages postés
1333
Date d'inscription
mercredi 31 août 2011
Dernière intervention
13 octobre 2018
-
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 Utilisateur anonyme