awk
Wbudowane zmienne
Szukaj…
FS - Separator pól
Używany przez awk do dzielenia każdego rekordu na wiele pól:
echo "a-b-c
d-e-f" | awk 'BEGIN {FS="-"} {print $2}'
spowoduje:
b
e
Zmienną FS można również ustawić za pomocą opcji -F :
echo "a-b-c
d-e-f" | awk -F '-' '{print $2}'
Domyślnie pola są oddzielone białymi spacjami (spacje i tabulatory), a wiele spacji i tabulatorów jest liczonych jako pojedynczy separator.
RS - Separator rekordów
Używany przez awk do dzielenia danych wejściowych na wiele rekordów. Na przykład:
echo "a b c|d e f" | awk 'BEGIN {RS="|"} {print $0}'
produkuje:
a b c
d e f
Domyślnie separatorem rekordów jest znak nowej linii.
Podobnie: echo "abc | de f" | awk „BEGIN {RS =" | "} {print 2 USD} '
produkuje:
b
e
OFS - Separator pól wyjściowych
Używany przez awk do oddzielania pól danych wyjściowych przez instrukcję print . Na przykład:
echo "a b c
d e f" | awk 'BEGIN {OFS="-"} {print $2, $3}'
produkuje:
b-c
e-f
Wartość domyślna to , ciąg składający się z pojedynczej spacji.
ORS - Separator rekordów wyjściowych
Używany przez awk do oddzielania rekordów i jest wyprowadzany na końcu każdej instrukcji print . Na przykład:
echo "a b c
d e f" | awk 'BEGIN {ORS="|"} {print $2, $3}'
produkuje:
b c|e f
Wartość domyślna to \n (znak nowej linii).
ARGV, ARGC - Tablica argumentów wiersza poleceń
Argumenty wiersza poleceń przekazywane do awk są przechowywane w wewnętrznej tablicy ARGV elementów ARGC . Pierwszym elementem tablicy jest nazwa programu. Na przykład:
awk 'BEGIN {
for (i = 0; i < ARGC; ++i) {
printf "ARGV[%d]=\"%s\"\n", i, ARGV[i]
}
}' arg1 arg2 arg3
produkuje:
ARGV[0]="awk"
ARGV[1]="arg1"
ARGV[2]="arg2"
ARGV[3]="arg3"
FS - Separator pól
Zmienna FS służy do ustawienia separatora pól wejściowych . W awk spacja i tabulator działają jak domyślne separatory pól. Dostęp do odpowiedniej wartości pola można uzyskać za pomocą $1 $2 $3 ... i tak dalej.
awk -F'=' '{print $1}' file
-
-F- opcja wiersza poleceń do ustawiania separatora pól wejściowych.
awk 'BEGIN { FS="=" } { print $1 }' file
OFS - Separator pól wyjściowych
Ta zmienna służy do ustawienia separatora pól wyjściowych, który jest domyślnie spacją.
awk -F'=' 'BEGIN { OFS=":" } { print $1 }' file
Przykład:
$ 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
Przypisanie $1 do $1 $1 $1=$1 modyfikuje pole (w tym przypadku $1 ), co powoduje awk odbudowuje rekord $0 . Odbudowa rekordu zastępuje ograniczniki FS OFS .
RS - Separator rekordów wejściowych
Ta zmienna służy do ustawienia separatora rekordów wejściowych, domyślnie nowej linii.
awk 'BEGIN{RS=","} {print $0}' file
ORS - Separator rekordów wyjściowych
Ta zmienna służy do ustawienia separatora rekordów wyjściowych, domyślnie nowej linii.
awk 'BEGIN{ORS=","} {print $0}' file
NF - liczba pól
Ta zmienna da ci całkowitą liczbę pól w bieżącym rekordzie wejściowym.
awk -F',' '{print NF}' file.csv
Przykład:
$ 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 - Całkowita liczba rekordów
Dostarczy całkowitą liczbę rekordów przetworzonych w bieżącej instancji awk .
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
W instancji przetworzono w sumie 8 rekordów.
FNR - liczba rekordów w pliku
Podaje całkowitą liczbę rekordów przetworzonych przez instancję awk stosunku do plików przetwarzanych przez awk
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
Każdy plik miał 4 wiersze, więc za każdym razem, gdy awk napotkał EOF FNR był resetowany do 0.
NF - liczba pól
Podaje liczbę kolumn lub pól w każdym rekordzie (rekord odpowiada każdej linii). Każda linia jest wyznaczona przez RS która domyślnie jest nowa linia.
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 (gdzieś tam) domyślnie ma tabulację lub spację. Harley, Quinn, Loves, Joker są uważane za kolumny. Wielkość liter obowiązuje dla dwóch następnych wierszy, ale ostatni wiersz ma 7 słów oddzielonych spacjami, co oznacza 7 kolumn.
FNR - numer bieżącego rekordu jest przetwarzany
FNR zawiera numer przetwarzanego wiersza pliku wejściowego. W tym przykładzie zobaczysz awk rozpoczynający się ponownie od 1, gdy zaczynasz przetwarzać drugi plik.
Przykład z jednym plikiem
$ cat file1
AAAA
BBBB
CCCC
$ awk '{ print FNR }' file1
1
2
3
Przykład z dwoma plikami
$ 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
Rozszerzony przykład z dwoma plikami
FNR może być użyty do wykrycia, czy awk przetwarza pierwszy plik, ponieważ NR==FNR jest prawdziwe tylko dla pierwszego pliku. Na przykład, jeśli chcemy dołączyć rekordy z plików file1 i file2 na ich FNR :
$ 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
Brak rekordu ZZZZ z file2 ponieważ FNR ma inną maksymalną wartość dla file1 i file2 i nie ma łączenia dla różnych wartości FNR .