Parser deux fichiers dans script sh [Résolu] - Shell

A voir également:Parser deux fichiers dans script shMerger 2 fichiers / script sh ✓ - Forum - Linux / Unix Script/ sh concat 2 fichiers ligne par ligne ✓ - Forum - Shell Script concaténation deux fichier ✓ - Forum - Programmation [Script SH] Comment afficher une ligne sur 2 ✓ - Forum - Shell Script sh - sed : suppression pattern dans un fichier ✓ - Forum - Linux / Unix

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




Forum

A voir également:Parser deux fichiers dans script shMerger 2 fichiers / script sh ✓ - Forum - Linux / Unix Script/ sh concat 2 fichiers ligne par ligne ✓ - Forum - Shell Script concaténation deux fichier ✓ - Forum - Programmation [Script SH] Comment afficher une ligne sur 2 ✓ - Forum - Shell Script sh - sed : suppression pattern dans un fichier ✓ - Forum - Linux / Unix

Web: www.shapebootstrap.net

3 réponses

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

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.

Reply
réponses:
  • auteur

    tu m'étonnes que ça va prendre des plombes avec toutes ces commandes externes !

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

Merci Exileur.

Je vais m'appuyer sur ton exemple.

Reply

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

salut,

une seule commande pour faire ce qui est demandé :

join

Reply
réponses:
  • auteur

  • auteur

    Salut,

    Non, ça ne le fera pas, faut bien lire la demande ;-\

  • auteur

    en effet,

    join
    ne suffira pas.

    bon, une seule commande, alors, pour faire ce qui est demandé :
    awk
    .
    XD

  • auteur

    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

  • auteur

    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

  • auteur

    Manque le site ^^

  • auteur

    corrigé

  • auteur

    Si les deux fichiers ne contiennent pas le méme nombre de ligne, ton code fonctionnerai ?

  • auteur

    Merci pour la commande, je ne l'a connaissais pas !
    Je vais voir ce qui est faisable avec !

    En attendant, ma methode fonctionne :)

  • auteur

    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).

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed