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:
- Veld één, dat “TecMint.com ” is, is toegankelijk via
$1
. - Veld twee, dat “is ” is, is toegankelijk via
$2
. - 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.