Numero reale su gawk
-
27-09-2019 - |
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?
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 impostaminlo
Eminla
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.