AWK – Transmission de la chaîne générée en tant que code pour awk à partir de la ligne de commande

J’essaie d’imprimer dynamicment les champs sélectionnés d’un fichier en utilisant awk .

Au fond, la question est de savoir pourquoi celui-ci fonctionne:

 awk -F';' '{print $3 ";" $4 ";" }' file 

mais cela ne veut pas:

 awk -F';' '{print '`echo '$3 ";" $4 ";"'`' }' file 

Mon but final est d’encapsuler ce qui précède dans une seule commande pour que je puisse faire

 my_cmd ';' 3 6 7 8 file(s) 

qui devrait afficher les champs #3,6,7,8 délimités par ; à partir de file(s) .

Édition de mon post: Je me suis rendu compte que mon problème était que écho insérait bien sûr un nouveau caractère de ligne qui causait un problème pour awk: o) \ c a fait l’affaire, même si \ “échapper a dû faire (voir ci-dessous).

 awk -F';' '{print '"`echo '$3 \";\" $4 \";\"\c'`"' }' file(s) 

Maintenant, il ne me rest plus qu’à le changer avec la commande qui va générer une chaîne comme $2 ";' $5 ";' $6 ";' $9 ";" $2 ";' $5 ";' $6 ";' $9 ";" $2 ";' $5 ";' $6 ";' $9 ";" (le nombre et les champs doivent être les entrées), etc., ce qui devrait aller de '{print ' et ' }'

Grâce à cbuckley, j’ai découvert ma commande en une ligne: (Problème résolu).

 cut -d"$1" -f `shift; echo $* | sed 's/[^ 0-9]\{1,\}.*$//;s/[ ]$//;s/[ ]\{1,\}/,/g'` `shift; printf "%s\n" $(echo $*) | grep -v '^[0-9]$'` 

ici $ * sont les parameters d’entrée et si ci-dessus serait comme un alias ou une fonction dans votre fichier .rc nommé say filterc alors le synopsys serait:

 filterc delimiter column1 [column2 [column3...]] file1 [file2 [file3...]] 

où:

délimiteur – un seul caractère

column1..n – un nombre représentant la colonne

file1..n – les fichiers à filtrer, en supposant que les fichiers n’auront pas de noms provenant uniquement de numéros et que tous ont le même format.

Votre commande sonne très similaire à cut :

 cut -d ';' -f 1,3 < 

Est-ce ce que vous êtes après?

 #!/bin/bash get_columns() { local fs=$1; shift local _awk= local column for column; do _awk="${_awk}\$${column}," done awk -F"$fs" -v OFS="$fs" "{ print ${_awk%,} }" } get_columns ';' 1 3 < 

-

 $ ./t.sh one;three foo;quux two-four six-eight 
 function my_cmd { fs="$1" shift eval file="\$$#" awk -F"$fs" -v flds="$*" ' BEGIN{ n=split(flds,f,/ /) } { for (i=1; i1?FS:""), $(f[i]) print "" } ' "$file" } $ cat file a;b;c;d;e;f;g;h $ my_cmd ';' 3 6 7 8 file c;f;g;h $ my_cmd ';' 6 3 8 file f;c;h