Domanda

Sto usando gawk su un computer Windows con Cygwin.Quello che sto cercando di fare è trovare il minimo e il massimo da tre colonne, due sono latitudine e longitudine e la terza colonna è il valore.

Questo è il codice:

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%    

Quello che ottengo è:

max is 465.053890    
max latitude is 31.846428    
max is 34.877658    
min 19.976970    
min 31.846428    
min 34.877658    

Il minimo e il massimo sono gli stessi per la lunetta e la latitudine.Come posso confrontare i numeri reali?

È stato utile?

Soluzione

Sono ragionevolmente sicuro che questa linea

'gawk "BEGIN {minc =1000} {minlo=1000} {minla=1000}

non fa quello che pensi che faccia.(Francamente, sono sbalordito che sia stato compilato, non penso che lo sarebbe in Kernighan AWK.) E molto di quello che sta succedendo qui è in realtà in, cosa, una finestra BAT file?

Ma ecco alcune ipotesi.

  • Penso che la riga che ho citato sopra sia impostata minc all'ora di inizio, quindi imposta minlo E minla ogni volta si legge una riga.Meglio sarebbe

.

 'BEGIN { minc = 1000; minlo = 1000; minla = 1000; } ....

o anche

 'BEGIN { minc = minlo = minla = 1000; } ....
  • in AWK devi fare attenzione un po' ai confronti, perché se non stai attento costringe i tuoi numeri a formare una stringa e fa un confronto di stringhe (cioè un ordinamento lessicografico) invece di un confronto numerico.

Ack, ho provato a farlo come risposta a un commento.Non andare.

Il motivo per cui la prima riga non funziona è che le righe AWK hanno la forma

PATTERN { code }

dove PATTERN è un'espressione che identifica un insieme di record di input (solitamente linee) su cui opera la parte di codice.Ci sono alcuni casi particolari, ad esempio BEGIN, che "corrisponde" prima che venga letto la prima volta.Un altro caso speciale è il pattern vuoto, che corrisponde ad ogni riga.Quindi quello che avevi veniva interpretato come

BEGIN {minc  =1000}
      {minlo =1000}
      {minla =1000}

Quindi, prima che la prima riga di input venga elaborata, minc è impostato su 1000. Seguente quello, su ogni linea di ingresso, minlo E minla sono impostati su 1000.Le mie versioni, poiché eseguono tutte l'inizializzazione in a BEGIN linea, basta inizializzare i valori una volta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top