Az adott problémát valóban meg lehet oldani egyetlen awk paranccsal. Az awk parancs segítségével egyszerre beolvashatjuk a fájlt és előállíthatjuk a kívánt SQL parancsokat. Az alábbi megoldás az awk parancsban végzi el az összes szükséges műveletet:
bash
awk ' { if ($2 == "dbs01" || ($2 == "vcenter01" && $3 == "web99")) { if ($1 > backup[$2 " " $3]) { backup[$2 " " $3] = $1 } } } END { for (h in backup) { split(h, arr, " ") hostname = (arr[2] == "dbs01") ? arr[2] : arr[3] print "UPDATE servers set backup='\''" backup[h] "'\'' WHERE hostname='\''" hostname "'\'';" } }' input.txt > updates.sql
Az input.txt tartalmazza az eredeti adatokat. Az awk parancs végrehajtása után az updates.sql fájl tartalmazni fogja az összes szükséges SQL frissítést.
Működés részletesen:
- Beolvasás: Az
awksoronként olvassa be a fájlt. - Feltétel ellenőrzése: Ellenőrzi, hogy az aktuális sor
dbs01vagyweb99tartalmaz-e. - Legnagyobb időbélyeg tárolása: Ha az aktuális sor időbélyege nagyobb, mint az előzőleg tárolt időbélyeg az adott hosztnévhez, akkor frissíti az időbélyeget.
- SQL parancsok generálása: Az
ENDblokkban létrehozza az SQL frissítési parancsokat.
Használat:
- Másold be a fenti
awkparancsot egy shell scriptbe vagy futtasd közvetlenül a terminálban. - Az input.txt fájl tartalmazza a bemeneti adatokat az eredeti formában.
- A kimeneti fájl (
updates.sql) tartalmazni fogja az SQL frissítési parancsokat.
Ez a megoldás egyszerűbb és hatékonyabb, mivel az awk segítségével egy lépésben megoldja a feladatot, és nem szükséges több iterációt futtatni a lista feldolgozásához.