Forum Programmation.shell Comment faire un 3ème fichier suite à une comparaison de 2 fichiers

Posté par  .
Étiquettes :
-1
19
déc.
2011

Bonjour à tous,

Suite à cet article : http://linuxfr.org/forums/programmationshell/posts/comparer-2-fichiers-plat-avec-awk

j'ai envie de montrer à mon équipe que parfois un petit script peut rendre bien des services eux qui ne sont que .net et .net et .net Grrrr

J'aimerai faire un script qui fait la chose suivante :

Etape 1- le script déplace today.csv vers yesturday.csv (écrase

Etape 2- Comparaison entre 2 fichiers .csv ( 'tomorrow.csv' et 'yesturday.csv' )
pour ne garder QUE les lignes DIFF + 'première ligne' "name,username,email,usertype"

Exemple :

tomorrow.csv contient :

name,username,email,usertype
a,a,a@a.com,a
b,b,b@b.com,b
c,c,c@c.com,c

yesturday.csv contient :

name,username,email,usertype
a,a,a@a.com,a
b,b,b@b.com,b

il faut comme résultat :

today.csv
name,username,email,usertype,activated
a,a,a@a.com,a,0
b,b,b@b.com,b,0
c,c,c@c.com,c,1

Merci beaucoup de votre aide

  • # diff -y fichierA fichierB

    Posté par  . Évalué à 2.

    ca te met les deux fichiers cote à cote
    avec des < ou > ou | pour te dire ce qui est commun et ce qui n'existe que d'un coté.

    man diff pour en savoir plus

    • [^] # Re: diff -y fichierA fichierB

      Posté par  (site web personnel) . Évalué à 2.

      Avec en plus un head -n 1 today.csv > differences.csv afin de conserver la première ligne.
      Et ensuite l'utilisation de >> pour concaténer le résultat du diff dans le fichier
      Ça doit faire un script shell de 2 lignes.

      Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN

  • # Eviv llehs-Z!

    Posté par  . Évalué à 4.

    #!/bin/zsh
    a=( ${(f)"$(<$1)"} )
    b=( ${(f)"$(<$2)"} )
    d=( $a[0],activated )
    for (( i=2, j=2; j<=$#b; j++ ))
    	if [[ $a[i] == $b[j] ]]; then
    		d+=( $a[i++],0 )
    	else
    		d+=( $b[j],1 )
    	fi
    print -l $d
    
    

    Usage:
    ./diff.zsh hier.csv demain.csv > aujourdhui.csv

  • # bash

    Posté par  . Évalué à 1.

    les en têtes, c'est le Mal, mais bon

    $ echo name,username,email,usertype,activated > today.csv
    $ tail -n+2 tomorrow.csv |while read line; do echo "$line,`dc -e "$(grep -c $line yesturday.csv) 1 + 2 % p"`" >> today.csv; done
    $ cat today.csv 
    name,username,email,usertype,activated
    a,a,a@a.com,a,0
    b,b,b@b.com,b,0
    c,c,c@c.com,c,1
    
    
    • [^] # Re: bash

      Posté par  . Évalué à 1.

      et sed, mais en utilisant la commande q (extension GNU d'après le man) et à l'en-tête (bouuuu!) près:

      while read line; do sed -ne "/$line/ {
          s/.*/&,0/p
          q
      }
      $ a $line,1
      " yesturday.csv; done < tomorrow.csv
      
      
  • # comm ?

    Posté par  . Évalué à -1.

    Si tes fichiers sont est triées :

    $ comm -3 tommorow.csv yesturday.csv
    c,c,c@c.com,c
    
    

    en rajoutant le head truc mentionné précédemment pour récupérer la première ligne.

    PS: comment on désactive l'éditeur shteumeleu5 qui me nique mon compose lorsqu'on édite un commentaire ?

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.