Parser deux fichiers dans script sh
Résolu
pcsystemd
Messages postés
702
Date d'inscription
Statut
Membre
Dernière intervention
-
Utilisateur anonyme -
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
Fichier 2
Je voudrais parser les deux fichiers pour en avoir qu'un seul avec comme résultat :
Fichier 3
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
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:
- Parser deux fichiers dans script sh
- Script vidéo youtube - Guide
- Comment faire deux colonnes indépendantes dans word - Guide
- Deux ecran pc - Guide
- Renommer des fichiers en masse - Guide
- Fichiers epub - Guide
3 réponses
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.
A plus
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
Utilisateur anonyme
tu m'étonnes que ça va prendre des plombes avec toutes ces commandes externes !
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 :
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