[SHELL] Compaison du nombre de lignes

Résolu
Bonjour à tous,

Je cherche à comparer si trois fichiers ont le même nombre de lignes. Voici mon code :

set nlines1 = `wc -l KsPiPi0_distribs/fichier1.dat | awk '{print $1}'`
set nlines2 = `wc -l KsPiPi0_distribs/fichier2.dat | awk '{print $1}'`
set nlines3 = `wc -l KsPiPi0_distribs/fichier3.dat | awk '{print $1}'`

if ( $nlines1==$nlines2 && $nlines2==$nlines3) then
echo "Files are OK !"

Ce code ne fonctionne pas : il me sort
syntax error near unexpected token `='
Et il n'a pas l'air de connaître les $var ...
Pouvez-vous m'aider ? Merci d'avance.
Configuration: Windows XP
Internet Explorer 7.0

7 réponses

  1. Modérateur
    Salut,

    D'abord quel est ton shell ? Au vu de la syntaxe du C-shell (csh), non ?
    Voilà un 1er script pour du "csh" :
    #! /bin/csh
    
    set nb1=`sed -n '$=' fich1`
    set nb2=`sed -n '$=' fich2`
    set nb3=`sed -n '$=' fich3`
    
    if ( "$nb1" == "$nb2" && "$nb1" == "$nb3" ) then
    echo "OK"
    else
    echo "NOK"
    endif
    Bien évidemment remplacer les noms de fichiers par les tiens. Comme tu peux le voir par rapport à ta syntaxe, pas d'espace lors de la déclaration des variables de part et d'autre du signe égale.

    Voilà un 2nd script pour un shell "bash" :
    #! /bin/bash
    
    nb1=$(sed -n '$=' fich1)
    nb2=$(sed -n '$=' fich2)
    nb3=$(sed -n '$=' fich3)
    
    if [ "$nb1" == "$nb2" -o "$nb1" == "$nb3" ]
    then
    echo "Ok"
    else
    echo "Nok"
    fi
    ;-))
    1. Salut,

      Merci pour vos réponses. Je suis effectivement en C-shell.

      J'ai essayé la commande :
      set nb1=`sed -n '$=' fich1`
      echo nb1 = $nb1

      Il m'affiche nb1 = (sans rien derrière le =)
      Il ne rentre pas non plus dans la boucle if, avec trois fichiers à nombres de lignes égaux.

      Avez-vous une idée de solution ? Je continue à chercher de mon côté. Merci beaucoup
      1. Modérateur
        Attention de bien changer le "fich1" par le fichier correspondant au tien, hein ? ;-)

        Sinon moi de mon côté je n'ai pas de problèmes...
        $ ls fich*
        fich1  fich2  fich3
        
        $ cat fich*
        ligne1
        ligne2
        ligne3
        ligne4
        
        ligne1
        ligne2
        ligne3
        ligne4
        
        ligne1
        ligne2
        ligne3
        ligne4
        
        $ cat essai.csh
        #! /bin/csh
        
        set nb1=`sed -n '$=' fich1`
        set nb2=`sed -n '$=' fich2`
        set nb3=`sed -n '$=' fich3`
        
        if ( "$nb1" == "$nb2" && "$nb1" == "$nb3" ) then
        echo "OK"
        else
        echo "Nok"
        endif
        
        $ ./essai.csh
        OK
        
        $ sed -n '$=' fich1
        4
        
        $ 
        ;-))
    2. Modérateur
      Au cas ou, en lieu et place du "sed" tu peux remettre ta ligne ou celle-là :
      nb=`wc -l fich1 | cut -d " " -f1`
      en remplaçant "fich1" par ton fichier ;-))
      1. Ca ne marche toujours pas. En entête du programme, j'ai #! /bin/sh
        #! /bin/csh -f
        J'ai besoin des deux pour mon code.

        Je copie mon code, y'a-t-il un problème ?

        set nlines_tm=`sed -n "$=" fichier1.dat`
        echo nlines_tm=$nlines_tm
        set nlines_scf=`sed -n "$=" fichier2.dat`
        set nlines_truth=`sed -n "$=" fichier3.dat`
        echo ca marche
        if ( "$nlines_tm" == "$nlines_scf" && "$nlines_tm" == "$nlines_truth") then
        echo "Ok."
        else
        echo "Not Ok."
        fi

        Il m'affiche :
        nlines_tm =
        ca marche
        fichier.csh: : command not found (ligne du 'if')
        Not Ok
        (alors que les fichiers ont le même nombre de lignes et que les noms sont bons).
        Merci de ton aide
        1. Modérateur
          Vire le 1er "shebang" (#! /bin/sh ), rajoute "endif" à la place du "fi" et ressaye...
          1. Seulement, si je supprime le /bin/sh, vu que j'ai un case dans mon programme, il m'affiche :

            syntax error near unexpected token `;;'

            Comment puis-je y remédier ?
            1. Modérateur
              #! /bin/csh -f
              
              set nb1=`sed -n '$=' fich1`
              set nb2=`sed -n '$=' fich2`
              set nb3=`sed -n '$=' fich3`
              
              echo nlines_tm = $nb1
              if ( "$nb1" == "$nb2" && "$nb1" == "$nb3" ) then
              echo "OK"
              else
              echo "Nok"
              endif
              
              switch ($nb1)
              case 1:
              echo un
              breaksw
              case 2:
              echo deux
              breaksw
              case 3:
              echo trois
              breaksw
              case 4:
              echo quatre
              breaksw
              default:
              echo "Autre que 1, 2, 3 ou 4."
              breaksw
              endsw
              ;-))
            2. Ok merci, j'ai un autre soucis.

              Il ne comprend pas la commande 'read' dans :

              echo -n "Question ? "
              read reponse

              Y'a-t-il une commande équivalente en C-shell ?
              Merci
            3. Modérateur
              @xavdougRe-
              #! /bin/csh
              
              echo -n "Question ? "
              set reponse=($<)
              echo
              echo "La question est : $reponse"
              echo
              
              
              
              $ ./try
              Question ? Pourquoi pas !
              
              La question est : Pourquoi pas !
              
              
              ;-))
            4. @xavdougMerci beaucoup pour ton aide. Tout est résolu maintenant.

              ;-)