Kā lietot Awk, lai drukātu laukus un kolonnas failā
Šajā mūsu Linux Awk komandu sērijas daļā mēs apskatīsim vienu no vissvarīgākajām Awk iezīmēm, kas ir lauka rediģēšana.
Ir labi zināt, ka Awk automātiski sadala tai paredzētās ievades līnijas laukos, un lauku var definēt kā rakstzīmju kopumu, kuru no citiem laukiem atdala iekšējais lauku atdalītājs.
Ja esat iepazinies ar Unix/Linux vai veicat bash apvalka programmēšanu, jums jāzina, kas ir iekšējā lauka atdalītāja (IFS) mainīgais. IFS noklusējuma IFS ir tabulēšanas taustiņš un atstarpe.
Tādā veidā Awk darbojas lauka atdalīšanas ideja: kad tā sastopas ar ievades līniju, saskaņā ar definēto IFS pirmā rakstzīmju kopa ir pirmais lauks, kuram piekļūst, izmantojot $1, otrajai rakstzīmju kopai ir divi lauki, kas piekļūst, izmantojot $2, trešā rakstzīmju kopa ir trešais lauks, kuram piekļūst, izmantojot $3 un tā tālāk līdz pēdējai (-ām) rakstzīmju kopai.
Lai labāk izprastu šo Awk lauka rediģēšanu, apskatīsim tālāk sniegtos piemērus:
1. piemērs: Esmu izveidojis teksta failu ar nosaukumu tecmintinfo.txt.
# vi tecmintinfo.txt # cat tecmintinfo.txt
Pēc tam no komandrindas mēģinu izdrukāt pirmo, otro un trešo lauku no faila tecmintinfo.txt, izmantojot zemāk esošo komandu:
$ awk '//{print $1 $2 $3 }' tecmintinfo.txt TecMint.comisthe
No iepriekš minētās izejas var redzēt, ka rakstzīmes no pirmajiem trim laukiem tiek drukātas, pamatojoties uz IFS definēto atstarpi:
- Pirmajam laukam, kas ir “TecMint.com”, var piekļūt, izmantojot
$1
. - Otrajam laukam, kas ir “ir”, piekļūst, izmantojot
$2
. - Trešajam laukam, kas ir “, piekļūst, izmantojot
$3
.
Ja esat pamanījis izdrukātajā laukā, lauka vērtības netiek nodalītas, un druka pēc noklusējuma rīkojas šādi.
Lai skaidri redzētu izvadi ar atstarpi starp lauka vērtībām, jums jāpievieno operators (,)
šādi:
$ awk '//{print $1, $2, $3; }' tecmintinfo.txt TecMint.com is the
Viena svarīga lieta, kas jāņem vērā un vienmēr jāatceras, ir tā, ka ($)
lietošana Awk atšķiras no tās izmantošanas čaulas skriptos.
Izmantojot čaulas skriptu, ($)
tiek izmantots, lai piekļūtu mainīgo vērtībai, savukārt Awk ($)
tas tiek izmantots tikai, piekļūstot lauka saturam, bet ne piekļuvei mainīgo lielumu vērtība.
2. piemērs: Apskatīsim vēl vienu piemēru, izmantojot failu, kas satur vairākas rindas ar nosaukumu my_shoping.list.
No Item_Name Unit_Price Quantity Price 1 Mouse #20,000 1 #20,000 2 Monitor #500,000 1 #500,000 3 RAM_Chips #150,000 2 #300,000 4 Ethernet_Cables #30,000 4 #120,000
Pieņemsim, ka katru pirkumu saraksta vienumu vēlaties izdrukāt tikai Unit_Price
, jums būs jāizpilda tālāk norādītā komanda:
$ awk '//{print $2, $3 }' my_shopping.txt Item_Name Unit_Price Mouse #20,000 Monitor #500,000 RAM_Chips #150,000 Ethernet_Cables #30,000
Awk ir arī printf
komanda, kas palīdz formatēt izvadi, ir jauks veids, kā redzat, ka iepriekš minētā izeja nav pietiekami skaidra.
Izmantojot printf
, lai formatētu Item_Name un Unit_Price izvadi:
$ awk '//{printf "%-10s %s\n",$2, $3 }' my_shopping.txt Item_Name Unit_Price Mouse #20,000 Monitor #500,000 RAM_Chips #150,000 Ethernet_Cables #30,000
Kopsavilkums
Lauka rediģēšana ir ļoti svarīga, ja Awk izmanto teksta vai virkņu filtrēšanai. Tas palīdz iegūt konkrētus datus saraksta kolonnās. Un vienmēr atcerieties, ka operatora ($)
lietošana Awk atšķiras no čaulas skriptu izmantošanas.
Es ceru, ka raksts jums bija noderīgs, un, lai iegūtu papildu informāciju vai jautājumus, komentāru sadaļā varat ievietot komentāru.