[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. je ne suis pas sûr mais essaie de remplacer les ' par ".
    0
    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
      ;-))
      0
      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
        0
        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
          
          $ 
          ;-))
          0
      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 ;-))
        0
        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
          0
          1. Modérateur
            Vire le 1er "shebang" (#! /bin/sh ), rajoute "endif" à la place du "fi" et ressaye...
            0
            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 ?
              0
              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
                ;-))
                0
              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
                0
              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 !
                
                
                ;-))
                0
              4. @xavdougMerci beaucoup pour ton aide. Tout est résolu maintenant.

                ;-)
                0
              5. Modérateur
                @xavdougDe rien ;-))
                0