Több bemeneti fájl feldolgozása az Awk segítségével
Bevezetés
Az Awk egy hatékony szövegfeldolgozó eszköz, amelyet a fejlesztők, rendszergazdák és elemzők széles körben használnak adatok különféle módon történő manipulálására. Ez egy sokoldalú eszköz, amely képes szöveges fájlok feldolgozására, adatok kibontására és különféle formátumokká alakítására. Az Awk egyik legfontosabb jellemzője, hogy képes több bemeneti fájl egyidejű feldolgozására, így ideális kötegelt feldolgozási feladatokhoz. Ebben a cikkben megvizsgáljuk, hogyan használható az Awk több bemeneti fájl feldolgozására, és számos példát vizsgálunk meg a gyakorlatban való felhasználására.
Az Awk használata több bemeneti fájllal
Az Awk egy parancssori eszköz, amelyet szöveges fájlok feldolgozására terveztek. Alapértelmezés szerint az Awk a szabványos bemenetről (stdin) olvassa be a bemenetet, amely átirányítható egy fájlból vagy egy másik parancsból. Az Awk azonban több bemeneti fájlt is képes feldolgozni egyidejűleg, ami hasznos lehet kötegelt feldolgozási feladatokhoz.
Több bemeneti fájl feldolgozásakor az Awk minden fájlt külön bemeneti adatfolyamként kezel. Az egyes fájlokat sorban olvassa be, felváltva feldolgozza az egyes fájlokból származó bemeneti adatokat. Ez azt jelenti, hogy ha több fájlja van, amelyek azonos típusú adatokat tartalmaznak, akkor az Awk segítségével az összeset egy lépésben feldolgozhatja, ahelyett, hogy minden fájlt külön-külön kellene feldolgoznia.
Adatok olvasása több bemeneti fájlból
Ha több bemeneti fájlból szeretne adatokat olvasni, megadhat fájlneveket argumentumaként az Awk számára, amikor fut. Tegyük fel például, hogy van két fájlja, a fájl1.txt és a fájl2.txt, amelyek a következő adatokat tartalmazzák:
fájl1.txt −
apple
banana
orange
fájl2.txt −
carrot
potato
Az Awk segítségével mindkét fájlból kiolvashatja az adatokat, és kinyomtathatja a képernyőre a következő - paranccsal
awk '{print}' file1.txt file2.txt
Ez a parancs arra utasítja az Awk-t, hogy a fájl1.txt és fájl2.txt fájlból is olvasson adatokat, és nyomtassa ki a képernyőre. A '{print}' paranccsal meghatározható, hogy az Awk minden egyes bemeneti adatsornál végrehajtsa a műveletet, ebben az esetben a képernyőre történő nyomtatáshoz.
Több bemeneti fájlból származó adatok kombinálása
Az Awk több bemeneti fájllal való használatának másik módja a fájlok adatainak egyetlen kimeneti adatfolyamba való egyesítése. Ez akkor lehet hasznos, ha több fájlja van, amelyek kapcsolódó adatokat tartalmaznak, és egyetlen adathalmazba szeretné egyesíteni őket. Ehhez a cat paranccsal összefűzheti a fájlokat, majd a kimenetet az Awk-ba irányíthatja.
Tegyük fel például, hogy van két fájlja, a fájl1.txt és a fájl2.txt, amelyek a következő adatokat tartalmazzák:
fájl1.txt −
1,apple
2,banana
3,orange
fájl2.txt −
1,carrot
2,potato
A következő paranccsal mindkét fájl adatait egyetlen kimeneti adatfolyamba egyesítheti −
cat file1.txt file2.txt | awk -F ',' '{print $1,$2}'
Ez a parancs a cat parancsot használja a fájl1.txt és fájl2.txt egyetlen kimeneti adatfolyamba való összefűzésére. A kimeneti adatfolyam ezután az Awk-ba kerül, amely vesszőt (',') használ mezőelválasztóként az -F kapcsolóval. A '{print $1,$2}' parancs az első és a második mező kinyomtatására szolgál minden bemeneti adatsorból, szóközzel elválasztva.
Adatok feldolgozása több bemeneti fájlból −
A több bemeneti fájlból származó adatok feldolgozása számos művelettel járhat, például szűréssel, rendezéssel és összesítéssel. Az Awk a beépített funkciók széles skáláját kínálja ezeknek a műveleteknek a végrehajtására, így hatékony eszköz az adatfeldolgozáshoz.
Tegyük fel például, hogy van két fájlja, a fájl1.txt és a fájl2.txt, amelyek a következő adatokat tartalmazzák:
fájl1.txt -
1,apple,0.5
2,banana,0.4
3,orange,0.3
fájl2.txt −
1,carrot,0.2
2,potato,0.1
Az Awk segítségével mindkét fájlból feldolgozhatja az adatokat, és kiszámíthatja az összes gyümölcs és zöldség össztömegét a következő paranccsal -
awk -F ',' '{if ($2 == "apple" || $2 == "banana" || $2 == "orange") sum += $3; else sum += 0.0} END {print sum}' file1.txt file2.txt
Ez a parancs a -F paramétert használja a vessző (',') megadásához mezőelválasztóként. Ezután egy if utasítást használ a nem gyümölcs adatok kiszűrésére a file2.txt fájlból, és kiszámítja az összes gyümölcs teljes súlyát mindkét fájlban. Az összeg változó nullára van inicializálva, és minden olyan bemeneti adatsornál növekszik, amely megfelel a gyümölcsfeltételeknek. Az END blokk az összeg végső értékének kinyomtatására szolgál.
Példák az Awk használatára több bemeneti fájllal
A könyvtárban lévő összes fájl teljes méretének kiszámítása
Tegyük fel, hogy ki szeretné számítani a könyvtárban és alkönyvtáraiban található összes fájl teljes méretét. A következő paranccsal létrehozhat egy listát a könyvtárban és annak alkönyvtáraiban lévő összes fájlról, majd a kimenetet az Awk-ba irányíthatja a teljes méret kiszámításához -
find /path/to/directory -type f -print0 | xargs -0 ls -l | awk '{sum += $5} END {print sum}'
Ez a parancs a find parancsot használja a könyvtárban és alkönyvtáraiban található összes fájl listájának létrehozásához, az xargs parancs pedig a listát az ls -l-nek adja át az egyes fájlok részletes listájának létrehozásához. Az ls -l kimenete ezután az Awk-ba kerül, amely az $5 mezőt használja az összes fájl teljes méretének kiszámításához bájtokban. Az END blokk az összeg végső értékének kinyomtatására szolgál.
Két CSV-fájl egyesítése
Tegyük fel, hogy van két CSV-fájlja, amelyek kapcsolódó adatokat tartalmaznak, és egyetlen CSV-fájlba szeretné egyesíteni őket. A következő paranccsal egyesítheti a fájlokat és az eredményt egy új fájlba adja ki:
awk 'FNR==1 && NR!=1 {next;}{print}' file1.csv file2.csv > merged.csv
Ez a parancs beépített FNR és NR változókat használ annak biztosítására, hogy a fejléc csak egyszer szerepeljen a kimeneti fájlban. Az első fájl feldolgozása normál módon történik, de a második fájl kimarad, ha az aktuális sorszám (FNR) egyenlő 1-gyel, és a teljes sorszám (NR) nem egyenlő 1-gyel. Az eredményül kapott kimenetet ezután átirányítja egy új fájlba, a merged.csv-be.
Következtetés
Az Awk egy hatékony szövegfeldolgozó eszköz, amely több bemeneti fájl feldolgozására használható. A beépített funkciók széles skáláját kínálja, amelyek sokféle módon használhatók adatok manipulálására, így ideális kötegelt feldolgozási feladatokhoz. Több bemeneti fájl kombinálásával az Awk segíthet az adatfeldolgozási munkafolyamatok egyszerűsítésében és az adatelemzési feladatok hatékonyságának javításában.