Selection d'une colonne en bash

jujitsu -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
j 'ai un fichier Identite.txt de la forme :
Identite.Nom Identite.Prenom Identite.Age
Redford Robert 56
Eastwood Cleant 80
Deep Johhny 42

Et j'aimerais en lancant la commande cat Identite.txt | script.sh Identite.Nom Identite.Age

qu'il m'affiche les deux colonnes Identite.Nom Identite.Age

Comment puis je faire cela ?

Merci d'avance
Configuration: Linux
Firefox 3.5.6

2 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    $ cat a3
    Identite.Nom Identite.Prenom Identite.Age
    Redford Robert 56
    Eastwood Cleant 80
    Deep Johhny 42
    $ 
    $ cat f9
    #!/bin/bash
    
    awk 'NR==1{nfy=split(arg,y);nfx=split($0,x);for(i=1;i<=nfx;i++){xx[x[i]]=i};next};{for(n=1;n<=nfy;n++)printf("%s ", $(xx[y[n]]));print ""}' arg="$*"
    $ 
    $ cat a3 | ./f9 Identite.Nom  Identite.Age
    Redford 56 
    Eastwood 80 
    Deep 42 
    $ 
    $ cat a3 | ./f9 Identite.Nom  Identite.Age Identite.Prenom
    Redford 56 Robert 
    Eastwood 80 Cleant 
    Deep 42 Johhny 
    $ 
    $ cat a3 | ./f9   Identite.Age
    56 
    80 
    42 
    $ 
    
    0
    1. zalex06 Messages postés 3 Statut Membre
       
      As tu recu mon message privée (jujistsu)
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    problèmes : le nombre de colonnes à afficher est variable et awk a besoin du No de la colonne

    NR==1 : on ne traite que la ligne 1
    nfy=split(arg,y) : on stocke chaque argument ($*) dans un tableau y, nfy est leur nombre
    nfx=split($0,x) : on stocke chaque nom de colonne dans un tableau x, nfx est leur nombre
    for(i=1;i<=nfx;i++){xx[x[i]]=i} : on stocke dans un tableau xx le No de chaque colonne en utilisant son nom, qui est dans x, comme index, on a donc xx[nom de la colonne]=No de la colonne
    next : on lit la suite
    ensuite pour chaque ligne:
    for(n=1;n<=nfy;n++)printf("%s ", $(xx[y[n]])) : on imprime chaque colonne par son numéro, contenu dans xx, dont le nom est dans y : $(xx[nom de la colonne]
    print "" : et un saut de ligne à chaque fin de ligne
    0