İkinci son sütunu / alanı awk olarak yazdır


164

İkinci son sütunu veya alanı awk olarak yazdırmak istiyorum. Alan sayısı değişkendir. Kullanabilmem gerektiğini biliyorum $NFama nasıl kullanılabileceğinden emin değilim.

Ve bu işe yaramıyor gibi görünüyor:

awk ' { print ( $NF-- )  } '

10
NFson alan endeksi, son alanın $NFdeğeri
glenn jackman

şimdi mantıklı. bu yüzden parantez dışındaki dolar çalışıyor sanırım
Brian G

Yanıtlar:


279
awk '{print $(NF-1)}'

Çalışmalı


2
Bu benim için işe yaramıyor. Ben Ubuntu altında awk 3.1.8 "başlık: 5: komut bulunamadı: NF-1" olsun.
Gurgeh


awk -F '.' '{print $(NF-2)}'
Gies0r

3
@Gurgeh: Bunun nedeni $(..), kullandığınız kabuğa bağlı olarak alt kabukta bir komut çağırmasıdır . Bunun $ (NF-1)yerine kullanarak bu soruna geçici bir çözüm bulabilirsiniz $(NF-1).
wting

21

Chris Kannon'un kabul edilen cevabına küçük bir ekleme: sadece gerçekten son bir ikinci sütun varsa yazdırın.

(
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) ) }'
)

15

En basit:

 awk '{print $--NF}' 

Orijinalin $NF--işe yaramamasının nedeni, ifadenin azalmadan önce değerlendirilmesi, oysa önek azalmamın değerlendirme öncesinde yapılmasıdır.


Bir anımsatıcı olarak, bu davranış C / Java vb. İle aynıdır int x = ++i int x = i++, önek önce artış anlamına gelir; postfix daha sonra artış anlamına gelir (önce atama).
Hafta Sonu


4

Sonuçtan uzak değildin! Bunu yapar:

awk '{NF--; print $NF}' file

Bu, bir $NFönceki alanın sayısını içeren alanların sayısını azaltır .

Ölçek

Bazı sayılar üretelim ve 5 kişilik gruplara yazalım:

$ seq 12 | xargs -n5
1 2 3 4 5
6 7 8 9 10
11 12

Sondan bir önceki her satıra yazdıralım:

$ seq 12 | xargs -n5 | awk '{NF--; print $NF}'
4
9
11

3

Chris Kannon'un awk çözümüne benzer Perl çözeltisi:

perl -lane 'print $F[$#F-1]' file

Bu komut satırı seçenekleri kullanılır:

  • n giriş dosyasının her satırı etrafında döngü, her satırı otomatik olarak yazdırmayın

  • l işlemeden önce yeni satırları kaldırır ve daha sonra tekrar ekler

  • aotomatik bölme modu - giriş satırlarını @Fdiziye böler . Boşlukta bölme varsayılanları

  • e perl kodunu çalıştır

@FOtomatik bölme dizisi endeksi başlar [0] awk alanları $ 1 ile başlarken.
$#Fiçindeki öğelerin sayısı@F


1
veya perl tarafından sağlanan negatif endekslemeyi kullanın ...$F[-2]
Sundeep

2

Rev komutunu kullanarak sağdan sola başlamaya çalıştınız mı? Bu durumda, sadece 2. sütunu yazdırmanız gerekir:

seq 12 | xargs -n5 | rev | awk '{ print $2}' | rev
4
9
11

1

Önce değeri azaltır ve sonra yazdırır -

awk ' { print $(--NF)}' file

VEYA

rev file|cut -d ' ' -f2|rev

0

Çok sayıda sütununuz varsa ve sondaki üç sütunu değil tümünü yazdırmak istiyorsanız, bu yardımcı olabilir

awk '{ $NF="";$(NF-1)="";$(NF-2)="" ; print $0 }'

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.