Parser deux fichiers dans script sh

Résolu/Fermé
Signaler
Messages postés
631
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
6 janvier 2022
-
 Utilisateur anonyme -
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




3 réponses

Messages postés
1468
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
26 octobre 2021
150
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.
0
Utilisateur anonyme
tu m'étonnes que ça va prendre des plombes avec toutes ces commandes externes !
0
Messages postés
631
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
6 janvier 2022
19
Merci Exileur.

Je vais m'appuyer sur ton exemple.
0

salut,

une seule commande pour faire ce qui est demandé :
join
0
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 586
Salut,

Non, ça ne le fera pas, faut bien lire la demande ;-\
0
Utilisateur anonyme >
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021

en effet,
join
ne suffira pas.

bon, une seule commande, alors, pour faire ce qui est demandé :
awk
.
XD
0
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 586 > Utilisateur anonyme
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
Utilisateur anonyme >
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021

awk 'BEGIN{FS=OFS="|"}NR==FNR{ar[$1,$2,$4]=$1"|"$2"|"$3"|"$4; next}{if($2"\034"$1"\034"$4 in ar)print ar[$2,$1,$4],$5,$6}' fic1 <(sort -t'|' -k2,2n fic2)
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
Messages postés
1468
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
26 octobre 2021
150 > Utilisateur anonyme
Manque le site ^^
0