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:

  1. Pirmajam laukam, kas ir “TecMint.com”, var piekļūt, izmantojot $1 .
  2. Otrajam laukam, kas ir “ir”, piekļūst, izmantojot $2 .
  3. 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.