( kassaiviktor | 2024. 05. 29., sze – 09:44 )

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:

  1. Beolvasás: Az awk soronként olvassa be a fájlt.
  2. Feltétel ellenőrzése: Ellenőrzi, hogy az aktuális sor dbs01 vagy web99 tartalmaz-e.
  3. 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.
  4. SQL parancsok generálása: Az END blokkban létrehozza az SQL frissítési parancsokat.

Használat:

  1. Másold be a fenti awk parancsot egy shell scriptbe vagy futtasd közvetlenül a terminálban.
  2. Az input.txt fájl tartalmazza a bemeneti adatokat az eredeti formában.
  3. 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.