Script shell

Résolu
remousse Messages postés 299 Date d'inscription   Statut Membre Dernière intervention   -  
remousse Messages postés 299 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai un problème au niveau d'un bout de script shell concernant la comparaison de 2 fichiers.
Je m'explique j'ai un fichier toto.zip.
Je ne dézippe que le fichier *.csv se trouvant à l'intérieur.
Puis j'aimerai comparer le nom de mon fichier csv ainsi obtenu avec le nom de l'archive elle-même.
En gros il me faudrait
if [toto.zip = toto.csv]


Voici mon début de code:

for file in $FILE
do
	if [ -e $file ]
	then
		unzip -qq $file "*.csv" -d zip
		if [ $? = 0 ]
		then
			if [ $(basename $file .${file##*.}) = $(basename *.csv .${*.csv##*.}) ]
			then
				echo "même nom"
			else


De plus auriez vous une astuce afin de limiter les if imbriqué que je trouve pas propre.

Par avance merci.

6 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    L'archive "liens.zip" contient un fichier nommé "liens.txt"
    L'archive "toto.zip" ne contient pas de fichier nommé "toto.txt"

    $ ls -1 *.zip
    liens.zip  
    toto.zip
    
    $ cat foo.sh 
    #! /bin/bash
    
    for file in *.zip
    do 
    (unzip -l ${file} | grep -q ${file%.*}.txt) && \
    echo "${file%.*} : Même nom." ||\
    echo "${file%.*} : Nom différent"
    done
    
    $ ./foo.sh 
    liens : Même nom.
    toto : Nom différent
    
    $ 
    0
  2. remousse Messages postés 299 Date d'inscription   Statut Membre Dernière intervention   6
     
    Parfait j'ai pu résoudre mon problème. Merci à toi.

    Désormais je me pose la question suivante.

    J'aimerai récupérer la valeur des cellules de la ligne 1 et des 4 premières colonnes de mon csv.

    J'arrive à afficher le contenu de mon fichier par:

    while read line  
    			do   
    			   echo -e "$line\n"  
    			done < $(basename $file .${file##*.}).csv
    


    Mais j'aimerai en gros pouvoir faire cela:

    BASE="A1"
    COL="A2"...

    Avez-vous idée sur ce sujet.

    Par avance merci.
    0
  3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    $ cat plop.csv 
    L1C1;L1C2;L1C3;L1C4;L1C5;L1C6;L1C7
    L2C1;L2C2;L2C3;L2C4;L2C5;L2C6;L2C7
    L3C1;L3C2;L3C3;L3C4;L3C5;L3C6;L3C7
    
    $ IFS=';' ; read BASE COL NUM NAME RESTE < <(head -1 plop.csv); unset IFS
    
    $ echo $BASE
    L1C1
    
    $ echo $COL
    L1C2
    
    $ echo $NUM
    L1C3
    
    $ echo $NAME
    L1C4
    
    $ echo $RESTE
    L1C5;L1C6;L1C7
    
    $

    Tu peux aussi faire via un tableau :

    $ IFS=';' ; read -a TABL < <(head -1 plop.csv); unset IFS
    
    $ echo ${TABL[0]}
    L1C1
    
    $ echo ${TABL[2]}
    L1C3
    
    $ echo ${TABL[3]}
    L1C4
    
    $

    0
  4. remousse Messages postés 299 Date d'inscription   Statut Membre Dernière intervention   6
     
    Je viens d'essayer ta méthode, pour mon cas la ligne est la suivante:

    IFS=';' ; read BASE COLLEC CLASSE META < <(head -1 $(basename $file .${file##*.}).csv); unset IFS
    


    Je me retrouve face à une erreur que voici:

    $ ./test.sh
      Starting Docubase
    ./test.sh: line 56: syntax error near unexpected token '<'
    ./test.sh: line 56: '                   IFS=';' ; read BASE COLLEC CLASSE META <
     <(head -1 $(basename $file .${file##*.}).csv); unset IFS'


    Je ne vois pas d'où cela peut-il provenir.

    Merci de ton aide zipe31
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Quel système ?
      Quel shell ?
      0
    2. remousse Messages postés 299 Date d'inscription   Statut Membre Dernière intervention   6
       
      Sur la machine où je dois développer cela je n'ai que Cygwin à ma disposition du coup je penses que cela vient de là je suis en train de mettre Ubuntu en Live USB.

      Pour le shell, je penses que tu dois parler de cela: #! /bin/sh !!! (je ne suis pas expert en shell mais n'est pas le choix de faire ce travail dans ce langage...)

      merci à toi
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Essaie comme ça alors :

      IFS=';'
      var=$(head -1 $(basename $file .${file##*.}.csv))
      read BASE COLLEC CLASSE META <<<${var}
      unset IFS
      0
    4. remousse Messages postés 299 Date d'inscription   Statut Membre Dernière intervention   6
       
      je n'ai plus l'erreur, par contre l'affichage avec echo $BASE me renvoie ceci:

      PK?0n!??D????testcsv.csv]??n?0????MB?%?*?a?dh??d??$?a????S??-? ??O}"?_?oC?u????)
      ?y???d?????>??Rh????~??0?????v'?????????????????^?????|?uw??{aun??n?9???w??O?O?o
      o?7???G??g?>l7???????*?R+0?@P?@??AKV????e??

      Aurais-tu une explication là dessus ?
      0
    5. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Est-ce que "basename $file .${file##*.}.csv" renvoie bien le nom de ton ".csv" ?

      Est-ce que "head -1 $(basename $file .${file##*.}.csv)" renvoie bien la 1ère ligne de ton fichier ?

      Si oui, est-elle bien formatée ?

      Le séparateur de ton ".csv" est bien le point virgule (;) ?
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Tiens essaie comme ça :

    $ cat foo.sh 
    #! /bin/bash
    
    #set -xv
    
    TARGET=target
    FILE=zip/*.zip
    
    for file in ${FILE}
    do 
    (unzip -l ${file} | grep -q $(basename ${file%.*}.csv)) && \
    (
    echo "${file%.*} : Même nom."
    unzip -qq ${file}  $(basename ${file%.*}.csv) -d ${TARGET}/
    
    var=$(head -1 ${TARGET}/$(basename ${file%.*}.csv))
    read BASE COLLEC CLASSE META RESTE <<<${var//;/ }
    
    echo "BASE = ${BASE}"
    echo "COLLEC = ${COLLEC}"
    echo "CLASSE = ${CLASSE}"
    echo "META = ${META}"
    echo "RESTE = $RESTE"
    )\
    ||\
    echo "${file%.*} : Nom différent"
    done
    
    
    $ ./foo.sh 
    zip/plop : Même nom.
    BASE = L1C1
    COLLEC = L1C2
    CLASSE = L1C3
    META = L1C4
    RESTE = L1C5 L1C6 L1C7
    zip/toto : Nom différent
    
    $
    0
  7. remousse Messages postés 299 Date d'inscription   Statut Membre Dernière intervention   6
     
    Parfait ton exemple fonctionne parfaitement.
    Je te remercie pour ton aide et ta patience.

    Ciao
    0