Chcę wydrukować przedostatnią kolumnę lub pole w awk. Liczba pól jest zmienna. Wiem, że powinienem móc go używać, $NFale nie jestem pewien, jak można go używać.
To nie działa dla mnie. Otrzymuję „title: 5: command not found: NF-1” w awk 3.1.8 pod Ubuntu.
Gurgeh
3
Unikałbym dekrementacji przed / po, aby upewnić się, że nie zmienisz wartości $ NF
Gregory Patmore
To się psuje, jeśli spróbujesz uzyskać trzecie ostatnie pole, takie jakawk -F '.' '{print $(NF-2)}'
gies0r
3
@Gurgeh: Dzieje się tak, ponieważ $(..)wywołuje polecenie w podpowłoce w zależności od używanej powłoki. Możesz obejść ten problem, używając $ (NF-1)zamiast $(NF-1).
wting
21
Drobny dodatek do zaakceptowanej odpowiedzi Chrisa Kannona: drukuj tylko wtedy, gdy faktycznie istnieje przedostatnia kolumna.
Przyczyną, dla której oryginał $NF--nie działał, jest to, że wyrażenie jest obliczane przed dekrementacją, podczas gdy moja dekrementacja przedrostka jest wykonywana przed oceną.
Jako mnemonik to zachowanie jest takie samo jak C / Java itp. int x = ++iint x = i++, Przedrostek oznacza najpierw inkrementację; postfix oznacza późniejszy przyrost (najpierw przypisanie).
NF
to ostatni indeks pola,$NF
to wartość ostatniego polaOdpowiedzi:
Powinno działać
źródło
awk -F '.' '{print $(NF-2)}'
$(..)
wywołuje polecenie w podpowłoce w zależności od używanej powłoki. Możesz obejść ten problem, używając$ (NF-1)
zamiast$(NF-1)
.Drobny dodatek do zaakceptowanej odpowiedzi Chrisa Kannona: drukuj tylko wtedy, gdy faktycznie istnieje przedostatnia kolumna.
źródło
To najprostsze:
Przyczyną, dla której oryginał
$NF--
nie działał, jest to, że wyrażenie jest obliczane przed dekrementacją, podczas gdy moja dekrementacja przedrostka jest wykonywana przed oceną.źródło
int x = ++i
int x = i++
, Przedrostek oznacza najpierw inkrementację; postfix oznacza późniejszy przyrost (najpierw przypisanie).źródło
Nie byłeś daleko od wyniku! Robi to:
To zmniejsza liczbę pól w jednym, tak więc
$NF
zawiera poprzednie przedostatnie.Test
Wygenerujmy kilka liczb i wydrukujmy je w grupach po 5:
Wypiszmy przedostatni w każdym wierszu:
źródło
Rozwiązanie Perla podobne do rozwiązania awk Chrisa Kannona:
Używane są następujące opcje wiersza polecenia:
n
pętla wokół każdego wiersza pliku wejściowego, nie drukuj automatycznie każdego wierszal
usuwa nowe wiersze przed przetworzeniem i dodaje je późnieja
tryb autosplit - dzielenie linii wejściowych na@F
tablicę. Domyślnie dzielenie na białe znakie
wykonać kod perla@F
Tablica autosplit rozpoczyna się indeksem [0], gdy pola awk zacząć od 1 $.$#F
to liczba elementów w@F
źródło
$F[-2]
Czy próbowałeś zacząć od prawej do lewej za pomocą polecenia rev? W takim przypadku wystarczy wydrukować drugą kolumnę:
źródło
Najpierw zmniejsza wartość, a następnie ją drukuje -
LUB
źródło
Jeśli masz wiele kolumn i chcesz wydrukować wszystkie, ale nie wszystkie trzy cloumns w ostatnim, może to pomóc
awk '{ $NF="";$(NF-1)="";$(NF-2)="" ; print $0 }'
źródło