Biorąc pod uwagę następujące polecenie:
echo "1: " | awk '/1/ -F ":" {print $1}'
dlaczego awk wyświetla:
1:
Biorąc pod uwagę następujące polecenie:
echo "1: " | awk '/1/ -F ":" {print $1}'
dlaczego awk wyświetla:
1:
Odpowiedzi:
„-F” to argument wiersza poleceń, a nie składnia awk, spróbuj:
echo "1: " | awk -F ":" '/1/ {print $1}'
(pattern){action}
. Jeśli pattern
(głównie instrukcja warunkowa) jest prawdziwa , action
jest wykonywana. Jeśli pattern
nie jest dostępny, true
sugeruje się. Tutaj pattern
jest /1/
w którym stwierdza się regex 1
dopasowane w bieżącym rekordzie$0
Jeśli chcesz to zrobić programowo, możesz użyć FS
zmiennej:
echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'
Zauważ, że jeśli zmienisz go w głównej pętli, a nie w BEGIN
pętli, będzie to miało wpływ na następną odczytaną linię, ponieważ bieżąca linia została już podzielona.
Istnieje wiele sposobów ustawienia :
jako separatora:
awk -F: '{print $1}'
awk -v FS=: '{print $1}'
awk '{print $1}' FS=:
awk 'BEGIN{FS=":"} {print $1}'
Wszystkie z nich są równoważne i dla zwrócą 1
przykładowe dane wejściowe „1: 2: 3”:
$ awk -F: '{print $1}' <<< "1:2:3"
1
$ awk -v FS=: '{print $1}' <<< "1:2:3"
1
$ awk '{print $1}' FS=: <<< "1:2:3"
1
$ awk 'BEGIN{FS=":"} {print $1}' <<< "1:2:3"
1
BEGIN
instrukcją byłby najbardziej poprawny (zgodny z ogólną awk
składnią).
BEGIN
jeśli używam pliku do przechowywania całej rzeczy, podczas gdy -F
przydaje się w przypadku jednowarstwowych.
awk 'BEGIN{print split("foo:bar",a)}' FS=":" file
iawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
-F
jest awk
sam w sobie argumentem :
$echo "1: " | awk -F":" '/1/ {print $1}'
1
Nie musisz tyle pisać. Po prostu umieść żądany separator pól z opcją -F w poleceniu awk, a numer kolumny, którą chcesz wydrukować, posegreguj zgodnie ze wspomnianym separatorem pól.
echo "1: " | awk -F: '{print $1}'
1
echo "1#2" | awk -F# '{print $1}'
1
AWK działa jako interpreter tekstu, który przebiega liniowo dla całego dokumentu i który jest zgodny z polem dla każdego wiersza, dlatego 1 $, 2 $ .. $ n to odniesienia do pól każdej linii (1 $ to pierwsze pole, 2 $ to drugie pole i tak dalej ...) Możesz zdefiniować separator pól za pomocą przełącznika „-F” pod wierszem poleceń lub w dwóch nawiasach kwadratowych za pomocą „FS = ...”. Rozważmy teraz odpowiedź „JUERGEN”:
echo "1: " | awk -F ":" '/1/ {print $1}'
Powyżej granic pól są ustawione przez „:”, więc mamy dwa pola $ 1, które jest „1” i 2 $, które JEST pustą przestrzenią. Następnie pojawia się wyrażenie regularne „/ 1 /”, które instruuje filtr, aby wyprowadzał tylko pierwsze pole kiedy tłumacz natknie się na linię zawierającą takie wyrażenie (mam na myśli 1); Dane wyjściowe polecenia „echo” to jeden wiersz zawierający „1”, więc filtr będzie działał ...
W przypadku następującego przykładu:
echo "1: " | awk '/1/ -F ":" {print $1}'
Składnia jest niechlujna, a tłumacz zdecydował się zignorować część F „:” i przełącza się na domyślny rozdzielacz pól, który jest pustą przestrzenią, a tym samym wypisuje „1:” jako pierwsze pole i nie będzie drugiego pola!
Odpowiedź JUERGEN zawiera dobrą składnię ...