Chcę wydrukować przedostatnią kolumnę lub pole w awk. Liczba pól jest zmienna. Wiem, że powinienem móc go używać, $NF
ale nie jestem pewien, jak można go używać.
I to nie wydaje się działać:
awk ' { print ( $NF-- ) } '
Chcę wydrukować przedostatnią kolumnę lub pole w awk. Liczba pól jest zmienna. Wiem, że powinienem móc go używać, $NF
ale nie jestem pewien, jak można go używać.
I to nie wydaje się działać:
awk ' { print ( $NF-- ) } '
Odpowiedzi:
awk '{print $(NF-1)}'
Powinno działać
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.
(
echo | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2 3 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
)
To najprostsze:
awk '{print $--NF}'
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ą.
int x = ++i
int x = i++
, Przedrostek oznacza najpierw inkrementację; postfix oznacza późniejszy przyrost (najpierw przypisanie).
awk ' { print ( $(NF-1) ) }' file
Nie byłeś daleko od wyniku! Robi to:
awk '{NF--; print $NF}' file
To zmniejsza liczbę pól w jednym, tak więc $NF
zawiera poprzednie przedostatnie.
Wygenerujmy kilka liczb i wydrukujmy je w grupach po 5:
$ seq 12 | xargs -n5
1 2 3 4 5
6 7 8 9 10
11 12
Wypiszmy przedostatni w każdym wierszu:
$ seq 12 | xargs -n5 | awk '{NF--; print $NF}'
4
9
11
Rozwiązanie Perla podobne do rozwiązania awk Chrisa Kannona:
perl -lane 'print $F[$#F-1]' file
Używane są następujące opcje wiersza polecenia:
n
pętla wokół każdego wiersza pliku wejściowego, nie drukuj automatycznie każdego wiersza
l
usuwa nowe wiersze przed przetworzeniem i dodaje je później
a
tryb autosplit - dzielenie linii wejściowych na @F
tablicę. Domyślnie dzielenie na białe znaki
e
wykonać kod perla
@F
Tablica autosplit rozpoczyna się indeksem [0], gdy pola awk zacząć od 1 $.
$#F
to liczba elementów w@F
$F[-2]
Najpierw zmniejsza wartość, a następnie ją drukuje -
awk ' { print $(--NF)}' file
LUB
rev file|cut -d ' ' -f2|rev
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 }'
NF
to ostatni indeks pola,$NF
to wartość ostatniego pola