2
votes

Quelque chose ne va pas lors de la compilation

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)
}

awk

0 commentaires

3 Réponses :


2
votes

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


3 commentaires

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 ...



3
votes

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



2
votes

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!

/ 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


0 commentaires