Egendefinierad funktion
Man kan även definiera egna funktioner. Syntaxen är lite lik JavaScript.
#Avrunda summan
Vi fortsätter med föregående exempel och tittar på hur vi med hjälp av en egen funktion kan avrunda summan korrekt. Vi skapar följande funktion överst i filen:
#!/usr/bin/env awk
function roundCorrect(val) {
val = val + 0.5
return val
}
...
{
dollar = int(roundCorrect($3/8.31))
printf("%d\t%-15s\t%-15s\t%5d\n", NR-1":",$1,$2,dollar)
}
...
Kör scriptet.
$ awk -f phones.awk phones.txt ---- Mobiltelefoner i lager ---- # Tillverkare Modell Pris 1 Apple iPhone X 963 2 Apple iPhone 11 1203 3 Samsung Galaxy S20 1143 4 Samsung Galaxy S21+ 1384 5 Samsung Galaxy Note20 963 ---- Slut på utskrift ----
Vi använder ett litet trick som löser avrundningen. Magiskt. Vi lägger på en totalsumma med, då vi har flera stycken i lager.
#!/usr/bin/env awk
function roundCorrect(val) {
val = val + 0.5
return int(val)
}
BEGIN {
FS=","
OFS="\t"
print "\n-------- Mobiltelefoner i lager --------\n"
printf("%s\t%-15s\t%-15s\t%-10s\t%-10s\t%s\n", "#", "Tillverkare", "Modell", "Antal", "Pris st", "Totalt pris")
total = 0
}
NR==1 { next }
{
dollar = int(roundCorrect($3/8.31))
current = dollar*$4
total += current
printf("%d\t%-15s\t%-15s\t%-10s\t%-10s\t%s\n", NR-1":",$1,$2,$4"st","$"dollar,"$"current)
}
END {
print "\nTotal summa: $"total
print "\n---- Slut på utskrift ----\n"
}
Här deklarerar vi variabeln total
i BEGIN blocket så den finns tillgänglig när vi läser in filen. Det slutliga resultatet ser ut något i stil med:
$ awk -f phones.awk phones.txt ---- Mobiltelefoner i lager ---- # Tillverkare Modell Antal Pris st Totalt pris 1 Apple iPhone X 3st $963 $2889 2 Apple iPhone 11 14st $1203 $16842 3 Samsung Galaxy S20 8st $1143 $9144 4 Samsung Galaxy S21+ 13st $1384 $17992 5 Samsung Galaxy Note20 4st $963 $3852 Total summa: $50719 ---- Slut på utskrift ----
#Revision history
- 2020-02-10: (A, lew) Första versionen.