[Shell] extraire une colonne

yaLINUXNUL Messages postés 45 Statut Membre -  
birkamoi Messages postés 5 Statut Membre -
Bonjour,

Je tente de récupérer dans une ligne la 56 ème colonne.

------
La ligne est la suivante :

0_1 1 1 1 SIN_CREIND_CREIND 20080415 020000 H/STD/SIN_CREIND_CREIND OUT5000E recto 0 000291.xml 3960 E 3960 P 23 23-CM GM H Facturation F oui non non non 0 "IdxListeGed" 1719700 part1 123456789.pdf,123456790.pdf non non part1 1719700 Maladie SIN CREIND CREIND OUT5000 DECOMPTE DECOMPTE 01823-CM$789$789#

------
Ma commande est la suivante :

read line
echo "$line"
var2=`echo $line | cut -d" " -f2`

echo lecture var2:$var2 change:$change

if [ "$var2" != "$change" ]

then
{
change=$var2
var1=`echo $line | cut -d" " -f1`
var3=`echo $line | cut -d" " -f3`
var4=`echo $line | cut -d" " -f4`
var5=`echo $line | cut -d" " -f5`
var6=`echo $line | cut -d" " -f31`

....

Actuellement, pour récupérer la colonne 56 je fais un f31. Je suppose que c'est parce qu'il y a des espaces ou des vides entre les tabulation.

-----

Merci de bien vouloir m'aider
Configuration: Windows XP
Internet Explorer 7.0

10 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Et avec "awk" c'est pas mieux ?
    awk '{ print $56 }'
    3960
    ;-))
    8
    1. yaLINUXNUL Messages postés 45 Statut Membre 1
       
      Si 3960 est le résultat, il correspont soit au contenu de la colone 15 ou 17.

      Et comment mettre le contenu dans la variable.
      0
    2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > yaLINUXNUL Messages postés 45 Statut Membre
       
      Salut,

      que comprends tu par colonne?
      c'est quoi le séparateur des colonnes?
      0
    3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > yaLINUXNUL Messages postés 45 Statut Membre
       
      Quel est le contenu exact de la colonne que tu essaies de récupérer ?
      Quel(s) est(sont) le(s) séparateur(s) de champs contenu(s) dans la phrase ?

      Pour récupérer la variable c'est comme pour le reste :
      var=$(awk '{ print $56 }' fichier)
      ;-))
      0
    4. yaLINUXNUL Messages postés 45 Statut Membre 1 > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
       
      Pardon, j'ai oublié de mettre que le séparateur de colonne ou de champs est le carcatère 'tabulation'
      0
    5. yaLINUXNUL Messages postés 45 Statut Membre 1 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
       
      Dans mon cas, fichier est une ligne du fichier et c'est le contenu de la colonne 56 de la ligne en cours .

      read line ....
      0
  2. yaLINUXNUL Messages postés 45 Statut Membre 1
     
    Je tente d'améliorer les infos.
    Lorsque je liste le fichier first_ligne1.txt,
    J'obient le résultat suivant :
    ([tabulation] remplace le caractère qui ne doit pas passer dans l'interface.
    Celà est-il plus 'parlant'
    -----
    0_1[tabulation]1[tabulation]1[tabulation]1[tabulation]SIN_CREIND_CREIND[tabulation]20080415[tabulation]020000[tabulation]H/STD/SIN_CREIND_CREIND[tabulation]OUT5000E[tabulation][tabulation]recto[tabulation]0[tabulation]000291.xml[tabulation][tabulation]3960[tabulation]E[tabulation]3960[tabulation]P[tabulation]23[tabulation]23-CM[tabulation][tabulation][tabulation]GM[tabulation]H[tabulation][tabulation][tabulation][tabulation]Facturation[tabulation]F[tabulation][tabulation]oui[tabulation][tabulation][tabulation][tabulation][tabulation]non[tabulation][tabulation][tabulation]non[tabulation][tabulation][tabulation]non[tabulation]0[tabulation][tabulation][tabulation][tabulation][tabulation][tabulation][tabulation][tabulation][tabulation][tabulation]"IdxListeGed"[tabulation]1719700[tabulation]part1[tabulation]123456789.pdf,123456790.pdf[tabulation]non[tabulation]non[tabulation]part1[tabulation]1719700[tabulation]Maladie[tabulation]SIN[tabulation]CREIND[tabulation]CREIND[tabulation]OUT5000[tabulation]DECOMPTE[tabulation]DECOMPTE[tabulation][tabulation]01823-CM$789$789#
    -----

    read line
    echo "$line"
    var2=`echo $line | cut -d" " -f2`

    echo lecture var2:$var2 change:$change

    if [ "$var2" != "$change" ]

    then
    {
    echo "$line" >/opt/editic/adf/test_hy/test_groupe_mutuel/sortie/firt_ligne$var2.txt
    ligne_index=`echo $line`
    change=$var2
    var1=`echo $line | cut -d" " -f1`
    var3=`echo $line | cut -d" " -f3`
    var4=`echo $line | cut -d" " -f4`
    var5=`echo $line | cut -d" " -f5`
    var6=`echo $line | cut -d" " -f31`
    0
  3. snouts Messages postés 87 Statut Membre 10
     
    le délimiteur de ton cut n'est pas bon
    pour une tabulation le caractère est \t ---> echo $line | cut -d "\t" -fX
    0
    1. yaLINUXNUL Messages postés 45 Statut Membre 1
       
      insulte de la part du shell

      +++ cut '-d\t' -f31
      cut: Le délimiteur doit être un caractère simple.
      Pour en savoir davantage, faites: « cut --help ».
      ------
      var6=`echo $line | cut -d"\t" -f31`
      0
      1. snouts Messages postés 87 Statut Membre 10 > yaLINUXNUL Messages postés 45 Statut Membre
         
        ... | cut -d "\t" -f X

        fais attention ou tu mets tes guillemets
        0
      2. yaLINUXNUL Messages postés 45 Statut Membre 1 > snouts Messages postés 87 Statut Membre
         
        J'ai fait un copié coller avec les espaces et j'ai la même insulte.
        0
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    awk -F"\t" '{ print $56 }'
    ;-))
    0
    1. snouts Messages postés 87 Statut Membre 10
       
      jipicy adore awk ^^
      0
      1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > snouts Messages postés 87 Statut Membre
         
        Salut,

        dans ce cas je ne pense pas qu'il y a plus simple ;-)
        en revanche je crois que jipicy adore sed ;-))
        0
    2. yaLINUXNUL Messages postés 45 Statut Membre 1
       
      J'ai l'impression que cette commande fonctionne en concatnnant les informations de tous les champs de toutes les lignes de mon fichier et ne donne pas l'information sur la ligne courante ?

      ou alors il faut que je supprime des éléments ...
      en mettant le var72, tout plante

      ------

      y=0
      change=oui
      while [ $y -ne $n ]
      do
      y=$(( $y + 1 ))

      read line
      echo "$line"
      var2=`echo $line | cut -d" " -f2`

      echo lecture var2:$var2 change:$change

      if [ "$var2" != "$change" ]

      then
      {
      echo "$line" >/opt/editic/adf/test_hy/test_groupe_mutuel/sortie/firt_ligne$var2.txt
      ligne_index=`echo $line`
      change=$var2
      var1=`echo $line | cut -d" " -f1`
      var3=`echo $line | cut -d" " -f3`
      var4=`echo $line | cut -d" " -f4`
      var5=`echo $line | cut -d" " -f5`
      var6=`echo $line | cut -d" " -f31`
      var72=$(awk -F"\t" '{ print $56 }')


      echo $var1
      echo $var2
      echo $var3
      echo $var4
      echo $var5
      echo $var6
      #echo $var72
      # Analyse des pdf
      #

      while read linea
      do
      echo "fichier : $linea"
      var10=`echo $linea`
      var12=`echo $var10 | cut -d"." -f1`
      var13=`echo $var10 | cut -d"." -f2`

      # appel de la fonction alpha
      alpha
      # appel de la fonction beta
      beta
      #done < <(echo $var6 | tr ',' '\n' | sort -u)
      done < <(echo $var72 | tr ',' '\n' | sort -u)

      }

      fi

      ------
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    J'en reviens toujours au fait de demander quelle est la valeur à récupérer ???

    Chez moi avec ta ligne (celle avec les "[tabulation]"), en changeant chaque "[tabulation]" par une véritable "tabulation" et cette commande, voilà ce que j'obtiens :
    $ echo "$var" | awk -F"\t" '{ print $56 }'
    CREIND
    C'est la bonne valeur ?
    0
    1. yaLINUXNUL Messages postés 45 Statut Membre 1
       
      la bonne valeur est :

      123456789.pdf,123456790.pdf

      cordialement
      0
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Y'avait quelques soucis avec tes "[tabulation]", certaines contenaient des tirets et n'étaient donc pas transformées en "\t", mais maintenant ça marche :
    $ echo "$var" | awk -F"\t" '{ print $56 }'
    123456789.pdf,123456790.pdf
    ;-))
    0
    1. yaLINUXNUL Messages postés 45 Statut Membre 1
       
      Bonjour, lil y a des progès.
      Mon soucis est que cette commande contanène les informations de l'ensembles des champs 56 du fichier. Je souhaiterai récupérer les information à chaque lecture séquentielle de ligne afin de traiter les fichiers pdf contenu dans le champs 1 par 1.
      actuellement, si mon fichier fait trois lignes et que je réalise ta commande, je récupére tous les noms de fichier pdf du fichier complet et non les noms des fichiers pdf de la ligne.
      Il y a peut être un paramètre permettant de travailler uniquements sur $line
      Qu'en penses-tu ?
      -----

      read line
      echo "$line"

      var72=$(awk -F"\t" '{ print $56 }')
      echo ttttt$var72

      while read linea
      do
      echo "fichier : $linea"
      var10=`echo $linea`
      var12=`echo $var10 | cut -d"." -f1`
      var13=`echo $var10 | cut -d"." -f2`
      done < <(echo $varvar72 | tr ',' '\n' | sort -u)

      }

      fi


      #done
      done < $1.tmp
      0
  8. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Ben il suffit de faire une boucle sur le fichier et de traiter chaque ligne à chaque itération de la boucle :
    while read line
    do
    var=$(awk -F"\t" '{ print $56 }' <<< "$line")
    ...
    ...
    ...
    done < fichier
    ;-))
    0
    1. yaLINUXNUL Messages postés 45 Statut Membre 1
       
      dans mes variable en retour je me retruve avec des caractères que je n'attends pas :

      en passant la ligne de comm&nde :

      var72=$(awk -F"\t" '{ print $56 }' <<< "$line")
      ---

      résultat pour la ligne 1 : var72=$'123456789.pdf\r'
      résultat pour la ligne 2 : var72=$'123456791.pdf,123456790.pdf\r'

      ---
      0
  9. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    que peux tu dire de la provenance de ton fichier?
    il ne viens pas depuis WIndows par hasard?
    0
    1. yaLINUXNUL Messages postés 45 Statut Membre 1
       
      il peut venir de windows ou UNIX.

      J'ai vérifié sous vi, il n'y a pas de ^M en fin des lignes.

      C'est celà que tu attendais comme réponse ?
      0
  10. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Bon, pour ne pas tourner en rond et chose qu'on aurait du te demander d'entrée, donnes-nous ton fichier de référence (sur cjoint) et dis-nous exactement ce que tu veux faire avec des exemples :
    - Je veux extraire le champ 56 de chaque ligne (exemple valeur )
    - Le récupérer dans une variable myvar=
    - Ensuite blablabla
    - Blablabla
    ...
    0
    1. yaLINUXNUL Messages postés 45 Statut Membre 1
       
      0_1 1 1 ....
      1_1 1 2....
      2_1 2 1....

      Pour chaque champ 2 ayant la même valeur

      Ecrrire un fichier contennant la première ligne du champ 2 dans un fichier xx'numerochamps2'.txt
      Extraire la liste des pdf contenue dans le champ 56 (1 à n fichiers)
      Mettre dans une variable la dernière valeur du champ 3
      pour chaque fichier de la liste
      lancer une commande unix avec comme paramètre $1 = nom fichier pdf $2 = valeur du champ 3


      -----
      xxx.sh $1=123456791.pdf $2=2
      xxx.sh $1=123456790.pdf $2=2
      xxx.sh $1=123456789.pdf $2=1

      ------

      J'ai mis le fichier, j'espère que c'est ok. http://cjoint.com/data/ezlsIOdjOK.htm

      est ce clair ou faut il d'autres informations ?

      Cordialement
      0
  11. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Tiens essaie ça :
    [tmpfs]$ cat foo.sh
    #! /bin/bash
    
    change=0
    
    while read line
    do
    champ2=$(echo "${line}" |awk -F"\t" '{ print $2 }')
    if [ "${champ2}" != "${change}" ]
            then
                    liste=$(echo "${line}" | awk -F"\t" '{ print $56 }')
                    champ3=$(echo "${line}" | awk -F"\t" '{ print $3 }')
                    echo "${line}" > xx${champ2}.txt
                    change=${champ2}
                    grep ',' <<<${liste} >/dev/null
                    retval=$?
                    if [ "${retval}" = 0 ]
                            then continue
                    fi
            else
                    champ3=$(echo "${line}" | awk -F"\t" '{ print $3 }')
                    change=${champ2}
    fi
    
    for file in ${liste/,/ }
    do
    echo "commande.sh ${file} ${champ3}"
    done
    done < 000291.tmp
    
    [tmpfs]$ ./foo.sh
    commande.sh 123456791.pdf 2
    commande.sh 123456790.pdf 2
    commande.sh 123456789.pdf 1
    
    [tmpfs]$ ls
    000291.tmp  foo.sh*  xx1.txt  xx2.txt
    [tmpfs]$ 
    Si c'est bien ce que tu veux, change le 'echo "commande.sh ${file} ${champ3}"' par la commande appropriée ;-))
    0