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

      ;-)
  2. Modérateur
    Vire le 1er "shebang" (#! /bin/sh ), rajoute "endif" à la place du "fi" et ressaye...
    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
        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. 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
          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
          ;-))