Hogyan (és miért) csinálni matematikát awk-val

Az Awk egy tiszteletreméltó szkriptnyelv, amelyet a 70-es években írtak a szövegszerkesztés automatizálására, amikor az asztali és a táblázat grafikus felületei vagy a mainframeken kívüli adatbázisok szinte ismeretlenek voltak: van-e értelme ezeknek a napoknak a számok feldolgozására?

Véleményem szerint így van - legalábbis a Gnu / Linux szerverek és asztali számítógépek esetében, ahol a feldolgozásra kerülő számok sokasága már egyszerű szöveges fájlokban van, vagy nagyon egyszerű ilyen formátumban beszerezni.

Az ilyen módon történő munkavégzés megszabadítja Önt egy adatbázis telepítésének és használatának megtanulásának szükségességétől. Ha csak néhány számot szeretne grafikon rajzolásához vagy más szkript elindításához, a szövegszerkesztő szkript elég gyorsan képes elvégezni a feladatot, hogy nem észlel semmilyen teljesítménybeli különbséget, és sokkal gyorsabban beállíthatja azt.

Ilyen esetekben az awk jó választás, mivel:

  • Hordozható . Az awk-t a Linux Standard Base specifikációja megköveteli, és a Wikipedia oldalát idézve "a Bourne Shell mellett, az egyetlen másik szkriptnyelv, amely a standard Unix környezetben elérhető".
  • Könnyű . Az awk könnyebb a rendszer erőforrásain, mint a Perl, legalábbis olyan kis szkriptekkel, amelyeket sokszor hívtak meg az egyszerű rutinok végrehajtására
  • Automatizált . Az awk parancsokat könnyű automatikusan előállítani más szkriptekből
  • Gnuplot kompatibilis . Az awk működése megkönnyíti a Gnuplot belsejéből történő hívást, hogy grafikonokat hozzon létre.
  • Teljes funkcionalitású . Az awk-nak elegendő matematikai funkciója van ahhoz, hogy a legtöbb felhasználó boldog legyen

Most, hogy összefoglaltam azért az okokat, hogy feldolgozzuk a számokat, itt van egy gyakorlati példa erre. Az itt nem releváns okokból nemrégiben rájöttem, hogy tudnom kell mind a három weboldal egyedi látogatásainak 7 napra számított gördülő átlagát, és a látogatók hány százaléka megy mindegyik oldalra. Van egy cron szkript, amely naponta egyszer fut, hogy az egyes oldalak látogatásait négy, szóközzel elválasztott oszlopban lévő fájlba mentsem. Az első oszlop a dátumot, a többi az egyes oldalak látogatásának száma:

 20110827 89 225 331 
 20110828 124 418 635 
 20110829 176 595 827 
 20110830 174 488 730 
 20110831 153 681 967 
 ... 

Feldolgozza ezeket a számokat, hogy egy kívánt awk szkripttel kapja meg a kívánt információkat, amelyet eredetileg ez a gördülő átlag trükk eredményez. Itt van a kibővített verzióm:

 1 #! / Usr / bin / awk -f 
 2 BEGIN {size = 7} { 
 3 mod = NR% méret 
 4 daytotal = 2 dollár + 3 dollár + 4 dollár 
 5 perc_2 = 100 * (2 dollár / napi összeg) 
 6 perc_3 = 100 * (3 dollár / napi összeg) 
 7 perc_4 = 100 * (4 dollár / napi összeg) 
 8, ha (max 
 9, ha (NR <= méret) {szám ++} 
 10 másik {sum- = tömb mod} 
 11 összeg + = napi összeg 
 12 tömb mod = nappali 
 13 printf "% 8.8s% 5.5s% 5.5s% 5.5s% 5.2f% 5.2f% 5.2f% 5.5s% 5.0f \ n", $ 1, $ 2, $ 3, $ 4, perc_2, perc_3, perc_4, nappali, összeg / count} 
 14 VÉG {nyomtasson "# legnagyobb forgalom be", max., ":", Max., "Látogatások"} 

A 2. és a 14. sor önmagában magyarázható, vagy legyen. Alapértelmezés szerint az awk egy sorban egyszerre egy sorban működik: az awk parancsfájlban szereplő összes parancsot minden sorhoz alkalmazzák. Ha azonban meg akarja csinálni valamit az említett sorok feldolgozása előtt vagy után, megteheti. Helyezze be a zárójeleket közvetlenül a BEGIN kulcsszó után, ami meg kell történnie a kezdés előtt, és jelölje be az END gombbal, mit kell tenni, ha nincs több bevitel. A parancsfájlban a gördülő átlag ablak méretét 7-re állítom be, és megmondom a szkriptnek, hogy közvetlenül kilépés előtt nyomtasson ki néhány összefoglaló adatot.

A szkript központi része azt mutatja, hogy megmondhatja az awknak, hogy viszonylag intuitív módon végezzen számításokat, miután ismer néhány alapvető kulcsszót. Awk-ban a speciális NR változó a már feldolgozott rekordok számát tartalmazza (alapértelmezés szerint a szövegbeviteli adatfolyam minden sora egy rekord). A $ N nevű változók ($ 1, $ 2 és így tovább) mindig tartalmazzák az aktuális rekord N mezőjét. Ezért a 4–7. Sorra mindössze annyit kell számolnom, hogy napi látogatások száma mekkora legyen, és hogy az egyes oldalak mennyit járulnak hozzá a forgalomhoz. Azt is mondom az awk-nak, hogy mentse el a legtöbb látogatást és azt a napot, amikor ezek megtörténtek a max és a maxday változóban (8. sor), így később kinyomtathatja őket (14. sor).

Mint más nyelveken is, a '%' a modulo operátor. A 3. sorban egy olyan index létrehozására használják, mod, amely folyamatosan ciklikusan változik a 0 és a "méret - 1" között, azaz 6.

Definíció szerint egy hétenkénti gördülő átlag kiszámításához össze kell számolnunk az adott napon kapott összes látogatást és a 6 korábbi látogatást, majd ezt a számot el kell osztani 7-vel. A szkript ezt három változóval hajtja végre: a count az osztási tényező, amely megegyezik a méret és az NR közötti maximális értékkel. az összeg, amint a neve is mondja, az összes látogatás összege az elmúlt héten. A tömb ehelyett egy 7 elemből álló tömb, amelyek mindegyike tartalmazza az összes látogatást az elmúlt 7 nap egyikében.

Minden alkalommal, amikor az awk betölti a sort az input fájlból, levonja az egy héttel korábban elvégzett látogatások összegéből (10. sor), majd hozzáadja az aktuális nap látogatásait (11. sor). A következő sor a hét nappal korábban beérkezett látogatások helyére a tömbben a jelenlegi naptárral lép. Végül a 13. sor mindent rendelt oszlopokban nyomtat, készen áll a rajzra vagy más módon történő feldolgozásra, az awk printf parancsnak köszönhetően:

 20110915 345 949 1412 12, 75 35, 07 52, 18 2706 1982 
 20110916 627 1330 2502 14, 06 29, 83 56, 11 4459 2392 
 20110917 841 1162 3265 15, 96 22, 06 61, 98 5268 2918 
 20110919 600 1361 2446 13, 61 30, 88 55, 50 4407 3367 
 20110920 118 221 380 16, 41 30, 74 52, 85 719 3111 
 # legnagyobb forgalom a 20110917-en: 5268 látogatás 
Kíváncsi az A ábra ezeket az időalapú adatokat, amelyeket a Gnuplot technikákkal ábrázoltam, amelyeket korábban magyaráztam.

© Copyright 2020 | mobilegn.com