Zoeken op website

Hoe Awk te gebruiken om velden en kolommen in een bestand af te drukken


In dit deel van onze Linux Awk-opdrachtenreeks zullen we een van de belangrijkste kenmerken van Awk bekijken, namelijk veldbewerking.

Het is goed om te weten dat Awk de ingevoerde regels automatisch in velden verdeelt, en een veld kan worden gedefinieerd als een reeks tekens die van andere velden worden gescheiden door een intern veldscheidingsteken.

Als je bekend bent met Unix/Linux of bash-shell programmeert, dan zou je moeten weten wat de interne veldscheidingsvariabele (IFS) is. De standaard IFS in Awk zijn tab en spatie.

Dit is hoe het idee van veldscheiding werkt in Awk: wanneer het een invoerregel tegenkomt, volgens de gedefinieerde IFS, is de eerste set tekens veld één, waartoe toegang wordt verkregen via $1<, de tweede set tekens is veld twee, toegankelijk via $2, de derde set tekens is veld drie, toegankelijk via $3, enzovoort tot de laatste set teken(s).

Laten we eens kijken naar de onderstaande voorbeelden om deze Awk-veldbewerking beter te begrijpen:

Voorbeeld 1: Ik heb een tekstbestand gemaakt met de naam tecmintinfo.txt.

vi tecmintinfo.txt
cat tecmintinfo.txt

Vervolgens probeer ik vanaf de opdrachtregel de eerste, tweede en derde velden uit het bestand tecmintinfo.txt af te drukken > met behulp van het onderstaande commando:

$ awk '//{print $1 $2 $3 }' tecmintinfo.txt

TecMint.comisthe

Uit de bovenstaande uitvoer kunt u zien dat de tekens uit de eerste drie velden worden afgedrukt op basis van de IFS gedefinieerde spatie:

  1. Veld één, dat “TecMint.com ” is, is toegankelijk via $1.
  2. Veld twee, dat “is ” is, is toegankelijk via $2.
  3. Veld drie, dat “de ” is, is toegankelijk via $3.

Als het u is opgevallen in de afgedrukte uitvoer, zijn de veldwaarden niet gescheiden en dit is hoe afdrukken zich standaard gedraagt.

Om de uitvoer duidelijk te bekijken met ruimte tussen de veldwaarden, moet u als volgt de operator (,) toevoegen:

$ awk '//{print $1, $2, $3; }' tecmintinfo.txt

TecMint.com is the

Een belangrijk ding om op te merken en altijd te onthouden is dat het gebruik van ($) in Awk anders is dan het gebruik ervan in shell-scripting.

Onder shell-scripting wordt ($) gebruikt om toegang te krijgen tot de waarde van variabelen, terwijl het in Awk ($) alleen wordt gebruikt bij toegang tot de inhoud van een veld, maar niet voor toegang tot de waarde van variabelen.

Voorbeeld 2: Laten we een ander voorbeeld bekijken, waarbij we een bestand gebruiken dat meerdere regels bevat met de naam 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		

Stel dat u alleen Unit_Price van elk item op de boodschappenlijst wilt afdrukken, dan moet u de onderstaande opdracht uitvoeren:

$ 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 heeft ook een printf commando dat je helpt je uitvoer te formatteren. Dit is een leuke manier, aangezien je kunt zien dat de bovenstaande uitvoer niet duidelijk genoeg is.

Gebruik printf om de uitvoer van de Item_Name en Unit_Price op te maken:

$ 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

Samenvatting

Veldbewerking is erg belangrijk wanneer u Awk gebruikt om tekst of tekenreeksen te filteren. Het helpt u bepaalde gegevens in kolommen in een lijst te krijgen. En onthoud altijd dat het gebruik van de operator ($) in Awk anders is dan dat in shell-scripting.

Ik hoop dat het artikel nuttig voor je was en voor eventuele aanvullende informatie of vragen kun je een reactie plaatsen in het commentaargedeelte.