Chcę tylko wydrukować dwie ostatnie kolumny.
Chcę tylko wydrukować dwie ostatnie kolumny.
Odpowiedzi:
Możesz skorzystać ze zmiennej, NF
która jest ustawiona na całkowitą liczbę pól w rekordzie wejściowym:
awk '{print $(NF-1),"\t",$NF}' file
przy założeniu, że masz co najmniej 2 pola.
awk '{print $(NF-1) "\t" $NF}' file
lub awk '{print $(NF-1), $NF}' file
lub awk 'BEGIN{OFS="\t"} {print $(NF-1), $NF}' file
.
'{print $x,"\t",$y}'
polega na tym, że awk interpretuje każdą zmienną oddzieloną przecinkami jako swoje własne pole, więc wynikiem będzie faktycznie field1<space><tab><space>field2
(ponieważ domyślnie użyje separatora spacji), w przeciwieństwie do field1<tab>field2
tego, co prawdopodobnie spodziewasz się. używanie separatora pól wyjściowych (OFS) jest prawie zawsze tym, czego potrzebujesz.
awk '{print $NF-1, $NF}' inputfile
Uwaga: działa to tylko wtedy, gdy istnieją co najmniej dwie kolumny. W przypadku rekordów z jedną kolumną otrzymasz fałszywy"-1 column1"
echo 1 2 3 | awk ...
. $NF-1
jest ($NF) - 1
w każdej awk
realizacji.
yacc
gramatycznych, co jest ironiczne, biorąc pod uwagę znaczenie litery A w awk. Różne wersje awk inaczej analizują rzeczy? Wielka niespodzianka!
echo '5 4 3 2 1' | awk '{print $NF-1,$NF; print $(NF-1), $NF}'
- lub jakimkolwiek innym wejściem, w którym drugie ostatnie pole jest nie mniejsze niż ostatnie pole.
@jim McNamara: spróbuj użyć nawiasów dla dokoła NF
, czyli $(NF-1)
i $(NF)
zamiast $NF-1
a $NF
(działa na Mac OS X 10.6.8 dla FreeBSD awk
i gawk
).
echo '
1 2
2 3
one
one two three
' | gawk '{if (NF >= 2) print $(NF-1), $(NF);}'
# output:
# 1 2
# 2 3
# two three
$(NF-1)
- co najmniej jest bardziej przenośne niż $NF-1
; jest zdecydowanie mniej niejednoznaczny. $(NF)
jest przesadą - po prostu wystarczy $NF
. Warto też chronić się przed wierszami z mniej niż 2 kolumnami, ponieważ w przypadku wierszy jednokolumnowych wartość pierwszej kolumny zostanie wyświetlona dwukrotnie , a przy wierszach z zerową kolumną - tj. Pustych - polecenie awk całkowicie się nie powiedzie z powodu próby dostęp do pola o indeksie -1.
użycie gawk wykazuje problem:
gawk '{ print $NF-1, $NF}' filename
1 2
2 3
-1 one
-1 three
# cat filename
1 2
2 3
one
one two three
Właśnie umieściłem gawk na Solarisie 10 M4000: Więc, gawk jest cuplritem w kwestii $ NF-1 kontra $ (NF-1). Następne pytanie, co mówi POSIX? za:
http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html
Nie ma żadnego kierunku w jedną lub drugą stronę. Niedobrze. gawk implikuje odejmowanie, inne awks wymagają odejmowania lub numeru pola. hmm.
$(NF-1)
jest to, że oba przykłady obliczania indeksu pola w specyfikacji używają tej postaci: $(NF-1)
i $(NF+2)
. Następnie jest sekcja „Wyrażenia w awk”, w której wymieniono $expr
jako mające [znacznie] wyższy priorytet niż expr - expr
. Ponieważ NF
samo w sobie jest wyrażeniem, $NF-1
należy obliczyć ($NF)-1
. Nawet JEŚLI w końcu istnieją implementacje awk, które oceniają $NF-1
jako $(NF-1)
, wyciągnięta tutaj lekcja jest taka, że używanie $(NF-1)
jest bezpiecznym i przenośnym wyborem.
spróbuj z tym
$ cat /tmp/topfs.txt
/dev/sda2 xfs 32G 10G 22G 32% /
awk print last column
$ cat /tmp/topfs.txt | awk '{print $NF}'
awk print before last column
$ cat /tmp/topfs.txt | awk '{print $(NF-1)}'
32%
awk - print last two columns
$ cat /tmp/topfs.txt | awk '{print $(NF-1), $NF}'
32% /