A=(aaa bbb ccc) cat abc.txt | awk '{ print $1, ${A[$1]} }' I want to index an array element based on the $1, but the code above is not correct in awk syntax. Could someone help?
4 Réponses :
Votre programme AWK dans des guillemets simples ne peut pas voir la variable d'environnement Shell A. En général, vous pouvez obtenir une petite substitution de shell pour fonctionner si vous utilisez des guillemets doubles au lieu de guillemets simples, mais cela est fait par la coquille, avant que AWK ne soit invoqué. Globalement, il est lourd de luge d'essayer de combiner Shell et Awk de cette façon. Si possible, je prendrais l'approche de Kurumi d'utiliser un tableau AWK. P>
Citations simples: un voile impénétrable. Double citations: généralement trop de travaux de travail. Alors choisissez votre poison: coquille ou awk. Sinon: votre code peut balk. P>
Vous ne pouvez pas indexer un tableau BASH code> à l'aide d'une valeur générée dans
awk code>, même si vous n'utilisez pas de guillemets simples (empêchant ainsi
Bash code> de faire n'importe quelle substitution). Vous pouvez passer le tableau dans, cependant.
awk 'BEGIN {a[1] = "foo bar" # sadly, there is no way to set an array all
a[2] = "baz" } # at once without abusing split() as above
{print $1, a[$1] }' <abc.txt
C'est une faute de frappe. Merci de me dire, je l'ai réparé.
@kurumi: hein? Qui remplaçait la "utilisation inutile de chat code>".
@Geekosaur, awk code> prend un fichier d'entrée.
awk '{}' nom de fichier code>
@kurumi Point, mais 6 sur une / une demi-douzaine de l'autre. Si quelque chose, la redirection est légèrement plus rapide. Est meilleur que dossier de chat | code>, cependant.
AWK acceptera un nom de fichier comme argument sans la nécessité de la rediriger en utilisant << / code> comme Kurumi a souligné. Tandis que
awk '{...}' A = FOO FileName fonctionnera, le formulaire que vous avez, CODE> AWK A = FOO '{...}' Nom du fichier` ne sera pas. Vous pouvez cependant faire
awk -v "a = foo" '{...}' nom de fichier code>.
Comment la redirection pourrait-elle être plus rapide? La coquille a le fardeau supplémentaire de la configuration et awk toujours i> doit ouvrir l'entrée.
@Geekosaur, je suis curieux, avez-vous réellement indiqué si la redirection est plus rapide que de simplement passer dans un argument de fichier? Si vous avez et cela prouve que la redirection est plus rapide, je changerai tous mes scripts pour utiliser la redirection. :)
@kurumi: Vous remarquerez seulement une différence de microsecondes, et il sera submergé par le temps de démarrage du processus. @Dennis: stdin code> est déjà ouvert et quelle configuration est nécessaire pour celui-ci (associer un
(fichier *) code> avec elle) va être effectué par
CRT0 < / Code> Que ce soit ou non
awk code> est ensuite avancé et ouvre un fichier différent. Mais la différence plus significative (dans la mesure où elle compte) est que
awk code> définit diverses choses lorsque vous ouvrez un argument de fichier défaut lorsque vous utilisez
stdin code>; En conséquence, c'est un peu (comme ci-dessus, uniquement par microsecondes) plus rapidement pour laisser la coquille le faire et le transmettre comme
stdin code>.
BTW, je suis un peu surpris que c'est un militant; Quand cela revient, c'est une préférence personnelle plus que toute autre chose.
@Geekosaur, sur mon système, la redirection est toujours plus lente. ;)
Ce n'est pas seulement la préférence personnelle, il existe des différences techniques entre les 2 approches. Si vous utilisez la redirection d'entrée, par exemple, AWK ne peut pas remplir la variable du nom de fichier, donc dans votre script AWK, vous n'avez pas accès au nom du fichier d'entrée. Les avantages de l'utilisation de la redirection entrent lorsqu'il y a une défaillance de l'ouverture du dossier et d'autres choses (la performance n'est pas un différentiateur), mais ils ne valent pas la peine d'IMHO à la lumière de la perte de nom de fichier. Certaines personnes à Comp.unix.Shell Ng pourraient fournir des détails et peut-être argumenter autrement.
Si vous allez coder du tableau A code>, vous pouvez simplement l'initialiser dans
awk code>
Vous pouvez également imprimer chaque élément de la matrice sur une ligne séparée avec PrintF et le tuyer à Awk. Ce code imprimera simplement Bash Array (Bash_arr) de AWK:
bash_arr=( 1 2 3 4 5 ) printf '%s\n' "${bash_arr[@]}" | awk ' { awk_arr[NR] = $0 } END { for (key in awk_arr) { print awk_arr[key] } }'