Parser deux fichiers dans script sh

Résolu/Fermé
pcsystemd Messages postés 702 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 6 novembre 2024 - Modifié le 16 mai 2018 à 11:36
 Utilisateur anonyme - 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




A voir également:

3 réponses

Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
Modifié le 17 mai 2018 à 11:29
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
0
Utilisateur anonyme
17 mai 2018 à 16:38
tu m'étonnes que ça va prendre des plombes avec toutes ces commandes externes !
0
pcsystemd Messages postés 702 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 6 novembre 2024 23
17 mai 2018 à 15:03
Merci Exileur.

Je vais m'appuyer sur ton exemple.
0
Utilisateur anonyme
17 mai 2018 à 16:38
salut,

une seule commande pour faire ce qui est demandé :
join
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
Modifié le 17 mai 2018 à 17:47
Salut,

Non, ça ne le fera pas, faut bien lire la demande ;-\
0
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
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 :)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418 > Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022
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).
0
Utilisateur anonyme > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
17 mai 2018 à 20:36
en effet,
join
ne suffira pas.

bon, une seule commande, alors, pour faire ce qui est demandé :
awk
.
XD
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418 > Utilisateur anonyme
17 mai 2018 à 21:21
En effet, et pour ça, reste plus qu'à attendre le maître en la matière : dubcek ;-)

Sinon, pour le fun et illustrer mes propos :

$ join -t'|' -1 1 -2 2 -o 1.1,1.2,1.3,1.4,2.5,2.6 <(sort -t '|' -n -k1 f1) <(sort -t '|' -n -k2 f2)
354|Titi|MARSEILLES|www.autredomaine.com|705|379
2543|Toto|PARIS|www.mondomaine.fr|5274|3646
3486|Tutu|BORDEAUX|www.monsite.com|2317|1508
0