Qu'est-ce que je me trompe s'il vous plaît? J'ai un code dans le fichier
file.awk:
BEGIN { CONVFMT="%0.17f" } function trunc(n, s) { s=index(n,".") return (s ? substr(n,1,s+6) : n) } /D Format/ { in_f_format=0; next } /F Format/ { in_f_format=1; next } in_f_format != 1 { next } !($1 ~ /^[1-9]/) { next } $1 == 35 { print t($5), t($6) }
J'écris:
Input-Output in F Format No. Curve Input Param. Correction Output Param. Standard Deviation 26 0 56850.9056460000 -0.0017608883 56850.9038851117 0.0016647171 35 1 0.2277000000 0.0011369754 0.2288369754 0.0014780395 35 2 0.2294000000 0.0000417158 0.2294417158 0.0008601513 35 3 0.2277000000 0.0007425066 0.2284425066 0.0022555311 35 4 0.2298000000 -0.0000518690 0.2297481310 0.0010186846 35 5 0.2295000000 0.0000793572 0.2295793572 0.0014667137 35 6 0.2300000000 0.0000752449 0.2300752449 0.0006258864 35 7 0.2307000000 -0.0001442591 0.2305557409 0.0002837569 35 8 0.2275000000 0.0007358355 0.2282358355 0.0007609550 35 9 0.2292000000 0.0003447650 0.2295447650 0.0007148005 35 10 0.2302000000 -0.0001854710 0.2300145290 0.0006320668 35 11 0.2308000000 -0.0002064324 0.2305935676 0.0008911070 35 12 0.2299000000 -0.0000202967 0.2298797033 0.0002328860 35 13 0.2298000000 0.0000464629 0.2298464629 0.0011609539 35 14 0.2307000000 -0.0003654521 0.2303345479 0.0006827961 35 15 0.2294000000 0.0002157908 0.2296157908 0.0003253584 Input-Output in D Format
dans le terminal et J'obtiens ces erreurs:
fatal: function `t' not defined
Où est l'erreur s'il vous plaît?
MODIFIER Script similaire
BEGIN { CONVFMT="%0.17f" } /D Format/ { in_f_format=0; next } /F Format/ { in_f_format=1; next } in_f_format != 1 { next } !($1 ~ /^[1-9]/) { next } $1 == 35 { print t($5), t($6) } function trunc(n, s) { s=index(n,".") return (s ? substr(n,1,s+6) : n) }
Donne une erreur:
./file.awk: Åádek 1: BEGIN: pÅÃkaz nenalezen ./file.awk: Åádek 2: /D: AdresáŠnebo soubor neexistuje ./file.awk: Åádek 2: next: pÅÃkaz nenalezen ./file.awk: Åádek 3: /F: AdresáŠnebo soubor neexistuje ./file.awk: Åádek 3: next: pÅÃkaz nenalezen ./file.awk: Åádek 4: in_f_format: pÅÃkaz nenalezen ./file.awk: Åádek 5: chyba syntaxe poblÞ neoÄekávaného tokenu â{â ./file.awk: Åádek 5: `!($1 ~ /^[1-9]/) { next }'
Je voudrais écrire à partir de cette entrée
chmod +x file.awk ./file.awk
les nombres en 5 $ et 6 $ en lignes commençant par 35.
MODIFIER 2 J'ai modifié la position de la fonction f comme
BEGIN { CONVFMT="%0.17f" } /D Format/ { in_f_format=0; next } /F Format/ { in_f_format=1; next } in_f_format != 1 { next } !($1 ~ /^[1-9]/) { next } $1 == 11 { prt(180,3.141592653589); next } $1 == 15 { prt(100,1); next } $1 == 20 { prt(10,1); next } $1 == 26 { next } { prt(1,1) } function prt(mult, div) { print trunc($5 * mult / div) ORS trunc($6 * mult / div) } function trunc(n, s) { s=index(n,".") return (s ? substr(n,1,s+6) : n) }
3 Réponses :
La manière canonique (je ne sais pas si c'est le bon mot) de l'utiliser est comme ceci:
./file.awk datafile
ou la manière canonique comme ceci:
#/usr/bin/awk -f
Ou vous pouvez ajouter #! / Usr / bin / awk -f
en haut du script (et chmod + x
). De cette façon, l'utilisateur n'a pas à se soucier du fait qu'il s'agit d'un script awk plutôt que d'un shell, de python ou d'un exécutable compilé. (Cela suppose que / usr / bin / awk
est l'emplacement de l'interpréteur.)
@KeithThompson Wow, c'est génial! Je vais l'essayer plus tard et mettre à jour ma réponse, merci beaucoup :)
FWIW Je n'utiliserais jamais un shebang pour appeler l'interpréteur awk car cela vous prive de la possibilité de séparer les arguments du script shell en variables awk et en arguments awk, par exemple shellscript foo bar
-> awk -v var = "$ 1" 'awkscript' "$ 2"
. Essayez de faire cette tâche simple et courante lorsque shellscript
utilise un awk shebang! S'il y a un réel avantage à utiliser l'approche shebang, cependant, je suis toute oreille ...
UPDATE: Après avoir discuté avec OP (que j'ai également mentionné dans mes commentaires), OP doit changer le nom de la fonction en fonction réelle de t
et cela a fonctionné alors. Pensé pour mettre à jour ici pour que tous le sachent.
Il pourrait y avoir 2 solutions possibles.
1ère: awk
dans shellscript et exécutez-le en tant que script shell.
awk -f awk_file Input_file
Donnez à script.ksh
les autorisations d'exécution appropriées et exécutez-le comme vous exécutez.
2ème: Exécutez-le comme un script awk
en l'exécutant comme:
XXX
Sans une ligne shebang, le shell pense que votre script est un script shell. Pour le rendre exécutable en tant que script awk , vous doivent utiliser la ligne shebang appropriée:
$ ./awkscript Hello, world!
où / usr / bin / awk
est le chemin de votre exécutable awk (peut être trouvé avec type awk
). L'important est l'indicateur -f
.
Vous pouvez maintenant l'exécuter en tant que script autonome:
cat <<'EOF' > awkscript #!/usr/bin/awk -f BEGIN { print "Hello, world!" } EOF chmod +x awkscript