Dos

Bonjour a tous les membres du Forum,

Excusez moi,je suis encore nouveau dans les commandes shell Linux;
je voudrais savoir comment visualiser la ligne et la colonne d'un mot dans un texte matriciel c'est a dire exemple:
le texte.txt est par exemple:

bob dou fou
rou sou reu
xou qou etr

et je recherche "sou"
il me stampe:
la ligne 2 et la colonne 2??
je reussis juste à stamper la ligne en ecrivant:

grep -n -w sou texte.txt

et il me stampe 2 sou,mais je veux aussi la colonne.

merci d'avance et bonne soirée à tous.

En faite tout ceci est un SCRIPT.

9 réponses

  • Votes
  • Date
  • Date décroissante
  1. salut,

    en 100% shell, c'est pas très compliqué.
    il faut que tu saches comment
    - parser un fichier
    - parser les éléments qui composent une ligne
    - incrémenter des variables numériques

    il y a de bons tutos sur ce site, tu devrais trouver comment faire tout ça.
    1. Modérateur
      Pour extraire la case (4,5) et en admettant que les cellules soient délimitées par le caractère espace, tu peux lancer :

      head -n4 matrice.txt | tail -n1 | cut -d" " -f5


      Autre approche, tu peux utiliser awk (fonctionne si le délimiteur de cellule est espace ou tabulation, sinon tu dois préciser à awk ce délimiteur) :

      awk '(NR == 4) {print $5}' matrice.txt


      Pour plus de détails sur ces commandes :

      man head
      man tail
      man cut
      man awk


      Bonne chance
      1. <cite>Bonne chance</cite>je crois que bertindenis tente ça chance au lâché de friandises, maintenant :))
        des fois que dans l'emballage lui soit donné la solution :(

        ce que propose l'excellent(e) mamiemando ne fonctionne pas ici, car il ne s'agit pas de dire ce qu'il y a à une certaine position qu'on connaît, mais plutôt de donner la position, qu'on ne connaît pas, d'un élément donné.
        1. Bjour a tous,
          oui je pense que monsieur mamiemando n'a pas epluché ma demande exacte. car il sagit d passer le mot ou l'entier à rechercher au file.txt et d retrouver la ligne et la colonne.
          merci tout de meme.
          1. Contributeur
            hello
            $ cat a3
            bob dou fou
            rou sou reu
            xou qou etr
            $ 
            $ awk -v var="sou" '$0 ~ var {for(n=1;n<=NF;n++)if($n == var){print NR, n; exit}}' a3
            2 2
            $ 
            $ awk -v var="etr" '$0 ~ var {for(n=1;n<=NF;n++)if($n == var){print NR, n; exit}}' a3
            3 3
            $ 
            $ awk -v var="bob" '$0 ~ var {for(n=1;n<=NF;n++)if($n == var){print NR, n; exit}}' a3
            1 1
            $ 
            1. Modérateur
              Au temps pour moi j'ai mal lu l'énoncé.

              Après l'avoir relu, j'aurais presque fait comme dubcek l'indique :

              awk -v var="sou" '{for(i = 1; i <= NF; i++) { if ($i == var) {print NR, i; exit } } }' a3


              Dans la solution de dubcek (qui marche) le test "$0 ~ var" (chercher si la valeur de var, par exemple "sou" est dans la ligne courante ($0)) est redondant avec le if.

              Comme ce test ne permet pas d'accélérer le programme (je dirais même qu'il le ralentit puisqu'il va falloir évaluer l'expression régulière et lire toute la ligne pour vérifier si le test est vrai ou faut), je ne le mettrais pas.

              Merci pour vos remarques et merci à dubcek pour sa solution.
              1. Contributeur
                effectivement, sur un très gros fichier, c'est plus rapide sans le $0 ~ var
                1. Merci à Tous, je suis très content pr votre soutien.
                  Bien d choses a toute l'équipe et merci encore pr toute l'attention que vous avez pr les membres...
                  1. Modérateur
                    J'en déduis que ton problème est résolu ? ;-)
                    --