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?

War es hilfreich?

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 dann minlo und minla 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top