Pytanie Ignoranta: część / 1 / ma powiedzieć awk, aby przetwarzało tylko wiersze (lub dokładniej rekordy), które zawierają numer 1, prawda?
rantsh
3
Wygląda na składnię @rantsh Awk (pattern){action}. Jeśli pattern(głównie instrukcja warunkowa) jest prawdziwa , actionjest wykonywana. Jeśli patternnie jest dostępny, truesugeruje się. Tutaj patternjest /1/w którym stwierdza się regex 1dopasowane w bieżącym rekordzie$0
kvantour
62
Jeśli chcesz to zrobić programowo, możesz użyć FSzmiennej:
Zauważ, że jeśli zmienisz go w głównej pętli, a nie w BEGINpętli, będzie to miało wpływ na następną odczytaną linię, ponieważ bieżąca linia została już podzielona.
jaki jest preferowany sposób? zakładam, że ostatni przykład z BEGINinstrukcją byłby najbardziej poprawny (zgodny z ogólną awkskładnią).
1
@ randomware wszystkie są w porządku. Zwykle używam, BEGINjeśli używam pliku do przechowywania całej rzeczy, podczas gdy -Fprzydaje się w przypadku jednowarstwowych.
fedorqui „SO przestań krzywdzić”
1
Trzeba powiedzieć, że istnieją subtelne różnice między trzecim przypadkiem a wszystkimi innymi. Przykład: awk 'BEGIN{print split("foo:bar",a)}' FS=":" fileiawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
Możesz także użyć wyrażenia regularnego jako separatora pól, następujące polecenie wydrukuje „pasek” za pomocą wyrażenia regularnego, aby ustawić liczbę „10” jako separator.
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.
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!
(pattern){action}
. Jeślipattern
(głównie instrukcja warunkowa) jest prawdziwa ,action
jest wykonywana. Jeślipattern
nie jest dostępny,true
sugeruje się. Tutajpattern
jest/1/
w którym stwierdza się regex1
dopasowane w bieżącym rekordzie$0
Jeśli chcesz to zrobić programowo, możesz użyć
FS
zmiennej: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.źródło
Istnieje wiele sposobów ustawienia
:
jako separatora:Wszystkie z nich są równoważne i dla zwrócą
1
przykładowe dane wejściowe „1: 2: 3”:źródło
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
jestawk
sam w sobie argumentem :źródło
Możesz także użyć wyrażenia regularnego jako separatora pól, następujące polecenie wydrukuje „pasek” za pomocą wyrażenia regularnego, aby ustawić liczbę „10” jako separator.
źródło
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.
źródło
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”:
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:
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ę ...
źródło
Lub możesz użyć:
To naprawdę zabawne równanie.
źródło
/1/
znaczy