awk
Ingebouwde variabelen
Zoeken…
FS - Veldscheider
Gebruikt door awk om elk record in meerdere velden te splitsen:
echo "a-b-c
d-e-f" | awk 'BEGIN {FS="-"} {print $2}'
zal resulteren in:
b
e
De variabele FS kan ook worden ingesteld met de optie -F :
echo "a-b-c
d-e-f" | awk -F '-' '{print $2}'
Standaard worden de velden gescheiden door witruimte (spaties en tabbladen) en tellen meerdere spaties en tabbladen als één scheidingsteken.
RS - Record Separator
Gebruikt door awk om de invoer in meerdere records te splitsen. Bijvoorbeeld:
echo "a b c|d e f" | awk 'BEGIN {RS="|"} {print $0}'
produceert:
a b c
d e f
Het recordscheidingsteken is standaard het teken voor de nieuwe regel.
Evenzo: echo "abc | de f" | awk 'BEGIN {RS = "|"} {print $ 2}'
produceert:
b
e
OFS - Uitvoerveldscheider
Wordt door awk gebruikt om velden te scheiden die worden uitgevoerd door de print . Bijvoorbeeld:
echo "a b c
d e f" | awk 'BEGIN {OFS="-"} {print $2, $3}'
produceert:
b-c
e-f
De standaardwaarde is , een string bestaande uit een enkele spatie.
ORS - Output Record Separator
Gebruikt door awk om records te scheiden en wordt uitgevoerd aan het einde van elke print statement. Bijvoorbeeld:
echo "a b c
d e f" | awk 'BEGIN {ORS="|"} {print $2, $3}'
produceert:
b c|e f
De standaardwaarde is \n (newline-teken).
ARGV, ARGC - Array of Command Line Argumenten
Opdrachtregelargumenten die zijn doorgegeven aan awk worden opgeslagen in de interne array ARGV van ARGC elementen. Het eerste element van de array is de programmanaam. Bijvoorbeeld:
awk 'BEGIN {
for (i = 0; i < ARGC; ++i) {
printf "ARGV[%d]=\"%s\"\n", i, ARGV[i]
}
}' arg1 arg2 arg3
produceert:
ARGV[0]="awk"
ARGV[1]="arg1"
ARGV[2]="arg2"
ARGV[3]="arg3"
FS - Veldscheider
De variabele FS wordt gebruikt om het scheidingsteken voor het invoerveld in te stellen. In awk fungeren spatie en tab als standaard veldscheidingstekens. De bijbehorende veldwaarde is toegankelijk via $1 , $2 , $3 ... enzovoort.
awk -F'=' '{print $1}' file
-
-F- opdrachtregeloptie voor het instellen van het invoerveldscheider.
awk 'BEGIN { FS="=" } { print $1 }' file
OFS - Uitvoerveldscheider
Deze variabele wordt gebruikt om het scheidingsteken voor het uitvoerveld in te stellen. Dit is standaard een spatie.
awk -F'=' 'BEGIN { OFS=":" } { print $1 }' file
Voorbeeld:
$ cat file.csv
col1,col2,col3,col4
col1,col2,col3
col1,col2
col1
col1,col2,col3,col4,col5
$ awk -F',' 'BEGIN { OFS="|" } { $1=$1 } 1' file.csv
col1|col2|col3|col4
col1|col2|col3
col1|col2
col1
col1|col2|col3|col4|col5
Toewijzen $1 tot $1 op $1=$1 modificeert een gebied ( $1 in dit geval) en dat leidt tot awk wederopbouw van de plaat $0 . Als het record opnieuw wordt opgebouwd, worden de scheidingstekens FS door OFS .
RS - Input Record Separator
Deze variabele wordt gebruikt om het invoerrecordscheidingsteken in te stellen, standaard een nieuwe regel.
awk 'BEGIN{RS=","} {print $0}' file
ORS - Output Record Separator
Deze variabele wordt gebruikt om het uitvoerrecordscheidingsteken in te stellen, standaard een nieuwe regel.
awk 'BEGIN{ORS=","} {print $0}' file
NF - Aantal velden
Deze variabele geeft u een totaal aantal velden in het huidige invoerrecord.
awk -F',' '{print NF}' file.csv
Voorbeeld:
$ cat file.csv
col1,col2,col3,col4
col1,col2,col3
col1,col2
col1
col1,col2,col3,col4,col5
$ awk -F',' '{print NF}' file.csv
4
3
2
1
5
NR - Totaal aantal records
Geeft het totale aantal records dat is verwerkt in de huidige awk instantie.
cat > file1
suicidesquad
harley quinn
joker
deadshot
cat > file2
avengers
ironman
captainamerica
hulk
awk '{print NR}' file1 file2
1
2
3
4
5
6
7
8
Een totaal van 8 records werd in de instantie verwerkt.
FNR - Aantal records in bestand
Geeft het totale aantal records dat door de awk instantie is verwerkt ten opzichte van de bestanden die awk verwerkt
cat > file1
suicidesquad
harley quinn
joker
deadshot
cat > file2
avengers
ironman
captainamerica
hulk
awk '{print FNR}' file1 file2
1
2
3
4
1
2
3
4
Elk bestand had elk 4 regels, dus telkens wanneer awk een EOF FNR tegenkwam, werd teruggezet op 0.
NF - Aantal velden
Geeft het aantal kolommen of velden in elke record (record komt overeen met elke regel). Elke regel wordt afgebakend door RS die standaard wordt ingesteld op newline.
cat > file1
Harley Quinn Loves Joker
Batman Loves Wonder Woman
Superman is not dead
Why is everything I type four fielded!?
awk '{print NF}' file1
4
4
4
7
FS (ergens daarboven) is standaard ingesteld op tab of spatie. Dus Harley, Quinn, Loves, Joker worden elk als kolommen beschouwd. De casus geldt voor de volgende twee regels, maar de laatste regel heeft 7 door spaties gescheiden woorden, wat 7 kolommen betekent.
FNR - Het huidige recordnummer dat wordt verwerkt
FNR bevat het nummer van de invoerbestandrij die wordt verwerkt. In dit voorbeeld ziet u awk opnieuw beginnen bij 1 wanneer u het tweede bestand begint te verwerken.
Voorbeeld met één bestand
$ cat file1
AAAA
BBBB
CCCC
$ awk '{ print FNR }' file1
1
2
3
Voorbeeld met twee bestanden
$ cat file1
AAAA
BBBB
CCCC
$ cat file2
WWWW
XXXX
YYYY
ZZZZ
$ awk '{ print FNR, FILENAME, $0 }' file1 file2
1 file1 AAAA
2 file1 BBBB
3 file1 CCCC
1 file2 WWWW
2 file2 XXXX
3 file2 YYYY
4 file2 ZZZZ
Uitgebreid voorbeeld met twee bestanden
FNR kan worden gebruikt om te detecteren of awk het eerste bestand verwerkt, aangezien NR==FNR alleen voor het eerste bestand geldt. Als we bijvoorbeeld records uit bestanden file1 en file2 op hun FNR willen samenvoegen:
$ awk 'NR==FNR { a[FNR]=$0; next } (FNR in a) { print FNR, a[FNR], $1 }' file1 file2
1 AAAA WWWW
2 BBBB XXXX
3 CCCC YYYY
Record ZZZZ uit file2 ontbreekt omdat FNR een verschillende maximale waarde heeft voor file1 en file2 en er geen join is voor verschillende FNR 's.