Vergleichen und berechnen Sie zwei Variablen mit mehreren Werten im Shell-Skript

2

Ich habe drei Hive-Abfragen in Shell-Skript geschrieben, um Soll- und Sollbeträge zu berechnen, die unter den Werten ausgegeben werden:

debit_amount :  BOI 4760545.650000 AXIS 284.49000000 SBI 87.220000000 ICICI 14199.66000

credit_amount :  BOI 3424.65 AXIS 43.4546 SBI 4.54546 ICICI 3423.3465

target_amount : BOI 4757121.000000 AXIS 241.0354 SBI 82.67454 ICICI 10776.3135

Jetzt möchte ich den Soll-Ist-Betrag für jede Bank berechnen und mit dem Soll-Ist-Wert vergleichen

Wie schreibe ich es in Shell-Skript?

Ich habe es mit dem Befehl awk versucht, aber keine erforderliche Ausgabe erhalten.

Nutzer
quelle
Versuchen Sie es mit grep -Eo. Checken Sie beide Flags ein man grep.
Theoden
Welche Shell benutzt du?
Choroba

Antworten:

0

Einfach in Perl:

echo "$output" | perl -lane '
$amount{$F[$_]}{$F[0]} = $F[$_ + 1] for 2, 4, 6, 8
}{
for $bank (grep $_, keys %amount) {
    print $bank, "\t",
          $amount{$bank}{debit_amount} - $amount{$bank}{credit_amount} - $amount{$bank}{target_amount}    
}
' 
  • -n Liest die Eingabe zeilenweise
  • -aTeilt jede Zeile im Whitespace auf das @FArray auf
  • -l fügt eine neue Zeile hinzu print

Die meisten Shells unterstützen keine Gleitkomma-Arithmetik, daher ist die Verwendung eines externen Tools unumgänglich. Hier ist ein Beispiel für die bashVerwendung bcfür Berechnungen:

amounts=($output)
for bank_idx in 2 4 6 8 ; do
    printf '%s\t' ${amounts[bank_idx]}
    bc -l <<< "${amounts[bank_idx + 1]} - ${amounts[bank_idx + 11]} - ${amounts[bank_idx + 21]}"
done

${amounts[@]}ist ein Array, das aus der gesamten Eingabe aufgebaut ist. Für jede Bank (Indizes 2, 4, 6 und 8) wird die Belastung bei Index + 1, die Gutschrift bei Index + 11 und das Ziel bei Index + 21 gespeichert.

Choroba
quelle
0

eine awk-lösung, die awk-datei

/debit_amount/ { for(i=3;i<=NF;i+=2) { bank[$i]=1 ; debit[$i]=$(i+1) ; } }
/credit_amount/ { for(i=3;i<=NF;i+=2) { bank[$i]=1 ; credit[$i]=$(i+1) ; } }
/target_amount/ { for(i=3;i<=NF;i+=2) { bank[$i]=1 ; target[$i]=$(i+1) ; } }

END {
  for ( b in bank ) printf "%-10s: d %f c %f t %f (%f) : %f\n",
      b,debit[b],credit[b],credit[b]-debit[b],target[b],target[b]+credit[b]-debit[b] ;
}

ausgeführt werden als

awk -f test.awk u

und gebe

BOI       : d 4760545.650000 c 3424.650000 t -4757121.000000 (4757121.000000) : 0.000000
AXIS      : d 284.490000 c 43.454600 t -241.035400 (241.035400) : 0.000000
ICICI     : d 14199.660000 c 3423.346500 t -10776.313500 (10776.313500) : 0.000000
SBI       : d 87.220000 c 4.545460 t -82.674540 (82.674540) : 0.000000

Sie können das gedruckte Feld in der printf-Anweisung anpassen.

Archemar
quelle