Reelle Zahl auf gawk
-
27-09-2019 - |
Frage
Ich bin mit gawk auf einem Windows-Computer mit Cygwin. Was ich versuche, ist find min und max von drei Spalten zu tun, sind zwei lat und lon und die dritte Spalte ist der Wert.
Dies ist der Code:
echo off
for /f "tokens=1,2,3 delims= " %%a in
('gawk "BEGIN {maxc = 0} {maxlo=0} {maxla=0}
{if ($3>maxc) maxc=$3} {if ($1>maxlo) maxlo=$1} {if ($2>maxla) maxla=$2} END
{print maxc, maxlo, maxla}" %file%.projected')
do (
set maxc=%%a
set maxlo=%%b
set maxla=%%c
)
echo max is %maxc%
echo max is %maxla%
echo max is %maxlo%
for /f "tokens=1,2,3 delims= " %%a in
('gawk "BEGIN {minc =1000} {minlo=1000} {minla=1000}
{if ($3<minc) minc=$3} {if ($1<minlo) minlo=$1} {if ($2<minla) minla=$2} END
{print minc, minlo, minla}" %file%.projected')
do (
set minc=%%a
set minlo=%%b
set minla=%%c
)
echo min %minc%
echo min %minla%
echo min %minlo%
Was ich bekommen ist:
max is 465.053890
max latitude is 31.846428
max is 34.877658
min 19.976970
min 31.846428
min 34.877658
Die min und max sind die gleichen für die lon und lat. Wie kann ich vergleichen reelle Zahlen?
Lösung
Ich bin ziemlich sicher, dass diese Zeile
'gawk "BEGIN {minc =1000} {minlo=1000} {minla=1000}
nicht tut, was Sie denken, es tut. (Ehrlich gesagt, ich bin es überhaupt zusammengestellt erstaunt, ich glaube nicht, dass es in Kernighan AWK hat.) Und eine Menge von dem, was hier los ist eigentlich in, was ein Fenster BAT
Datei?
Aber hier sind einige Vermutungen.
- Ich denke, die Linie, die ich oben zitiert Sätze zum Startzeitpunkt
minc
, und setzt dannminlo
undminla
jedes Mal es liest eine Zeile. Besser wäre
.
'BEGIN { minc = 1000; minlo = 1000; minla = 1000; } ....
oder auch
'BEGIN { minc = minlo = minla = 1000; } ....
- in AWK müssen Sie ein wenig mit Vergleiche aufpassen, denn wenn Sie nicht vorsichtig sind es Ihre Zahlen zu bespannen nötigt und tut ein String vergleichen (dh lexikographische Ordnung) anstelle eines numerischen vergleichen.
Ack, versucht auf einen Kommentar dies als eine Antwort zu tun. No go.
Der Grund, die erste Zeile nicht funktioniert ist, dass AWK Zeilen haben die Form
PATTERN { code }
wobei PATTERN einige diesen Ausdruck identifiziert einen Satz von Eingangsdatensätzen (in der Regel Linien), auf das der Codeteil arbeitet. Es gibt einige Sonderfälle, zum Beispiel BEGIN
, die „Begegnungen“ vor dem ersten Mal gelesen werden. Ein weiterer Sonderfall ist das leere Muster, die jede Zeile übereinstimmt. Also, was Sie interpretiert wurde war als
BEGIN {minc =1000}
{minlo =1000}
{minla =1000}
Also, bevor die erste Zeile der Eingabe verarbeitet wird, minc
auf 1000 gesetzt ist Nach , dass auf alle Eingabezeile, minlo
und minla
sind auf 1000 gesetzt. Meine Versionen, da sie alle die Initialisierung in einer BEGIN
Linie tun, initialisieren nur die Werte einmal.