Tek istediğim yazdırılan son iki sütun.
Tek istediğim yazdırılan son iki sütun.
Yanıtlar:
NF
Giriş kaydındaki toplam alan sayısına ayarlanmış değişkeni kullanabilirsiniz :
awk '{print $(NF-1),"\t",$NF}' file
bu, en az 2 alanınız olduğunu varsayar.
awk '{print $(NF-1) "\t" $NF}' file
Veya awk '{print $(NF-1), $NF}' file
veya olmalıdır awk 'BEGIN{OFS="\t"} {print $(NF-1), $NF}' file
.
'{print $x,"\t",$y}'
, awk'ın virgülle ayrılmış her değişkeni kendi alanı olarak yorumlamasıdır, bu nedenle sonuç gerçekte olacaktır field1<space><tab><space>field2
(çünkü varsayılan olarak beyaz boşluk sınırlayıcı kullanacaktır) field1<tab>field2
, muhtemelen hangisidir? bekliyorsun. Çıktı Alanı Ayırıcısı (OFS) kullanmak neredeyse her zaman istediğiniz şeydir.
awk '{print $NF-1, $NF}' inputfile
Not: Bu, yalnızca en az iki sütun varsa çalışır. Tek sütunlu kayıtlarda sahte bir"-1 column1"
echo 1 2 3 | awk ...
. $NF-1
olduğu ($NF) - 1
her awk
uygulanmasına.
yacc
dilbilgisinde 40'tan fazla çelişki vardır , bu da A'nın awk cinsinden ifade ettiği şey düşünüldüğünde ironiktir. Her şeyi farklı şekilde ayrıştıran awk'ın farklı sürümleri? Büyük sürpriz!
echo '5 4 3 2 1' | awk '{print $NF-1,$NF; print $(NF-1), $NF}'
- veya son 2. alanın son alandan daha az olmadığı başka herhangi bir girdi.
@jim mcnamara: etrafında parantez kullanmayı deneyin NF
, yani $(NF-1)
ve $(NF)
yerine $NF-1
ve $NF
(FreeBSD için Mac OS X 10.6.8'de çalışır awk
ve 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)
olan bir cevap için +1 - en azından $NF-1
; kesinlikle daha az belirsiz. $(NF)
ama aşırıdır - sadece $NF
yapacak. Tek sütunlu satırlarda ilk sütun değerini iki kez elde edeceğiniz ve sıfır sütun - yani boş - satırlarda awk komutu bir girişim nedeniyle tamamen başarısız olacağı için, 2'den az sütunlu satırlara karşı koruma sağlamak da faydalıdır. -1 indeksi olan bir alana erişmek için.
gawk kullanmak sorunu gösterir:
gawk '{ print $NF-1, $NF}' filename
1 2
2 3
-1 one
-1 three
# cat filename
1 2
2 3
one
one two three
Solaris 10 M4000'e gawk koydum: Yani, gawk, $ NF-1'e karşı $ (NF-1) sorununun kupasıdır. Sonraki soru POSIX ne diyor? başına:
http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html
Öyle ya da böyle bir yön yok. İyi değil. gawk çıkarma anlamına gelir, diğer awks ise alan numarası veya çıkarma anlamına gelir. hmm.
$(NF-1)
, spesifikasyondaki alan indeksini hesaplamanın iki örneğinin her ikisinin de şu formu kullanmasıdır: $(NF-1)
ve $(NF+2)
. Sonra, $expr
[çok] daha yüksek önceliğe sahip olarak listeleyen "awk içindeki ifadeler" bölümü var expr - expr
. Bu yana NF
bir ekspresyon kendisi, $NF-1
hiç değerlendirmelidir ($NF)-1
. Sonuçta, orada bile, EĞER gerçekten değerlendirmek orada uygulamaları awk $NF-1
olarak $(NF-1)
, ders burada öğrendim kullanarak olmasıdır $(NF-1)
güvenli ve taşınabilir bir seçimdir.
bununla dene
$ 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% /