bir alanın değerinin 3 - sed veya awk'den küçük veya ona eşit olduğu satırları kaldır?


18

Ben 8 alanında (sütun) 2 veya daha düşük bir değere sahip her satırı kaldırmak gerekiyor.

Verilerim şöyle:

12-31   Airport 189 379 41  49.70946503 -124.91377258   2   2880    30.8
01-01   AlberniElementary   165 331 16  49.26100922 -124.80662537   4   5760    26.1
01-09   BamfieldMarine  161 323 23  48.83490372 -125.13572693   2   2875    27.4
01-10   BamfieldMarine  161 323 23  48.83490372 -125.13572693   3   3068    38.6

Awk kullanarak istenen değerleri kaldırabilir ve başka bir dosyaya yazdırabilirsiniz ve sed geçerli dosyayı düzenleyeceğini anlıyorum. Her iki durumda da, orijinal dosyayı korumam gerekiyor.

Not : Lütfen çözümlerinizle ilgili ayrıntılı açıklamalar sağlayın. Sadece komutu yazmak yeterli değildir, lütfen önerilere açıklama ekleyin.

Ek not : Verilerin bir başlık satırı vardır, bu nedenle büyük olasılıkla çözümün

awk 'FNR> 1'

Sanırım?

Yanıtlar:


20

Neredeyse anladın.

 awk '(NR>1) && ($8 > 2 ) ' foo > bar

nerede

  • NR kayıt sayısıdır (satır sayısıdır)
  • $8 sekiz alan
  • && mantıklı ve
  • foo orijinal dosya değişmemiş
  • bar sonuçta ortaya çıkan dosya
  • örtük varsayılan eylem, geçerli giriş satırını yazdırmaktır

Unutmamak için başlığın foo'dan çubuğa çizgili olduğunu unutmayın

 awk '(NR==1) || ($8 > 2 ) ' foo > bar

nerede

  • || mantıklı veya
  • NR == 1 ise veya $ 8> 2 ise giriş satırı yazdırılır

Güncelleme # 1

Bir aralık belirtmek için

  • ( ($8 >= -4) && ( $8 <= 4 ) ) 8. alan -4'ten 4'e
  • (NR == 1 ) || ( ($8 >= -4) && ( $8 <= 4 ) ) başlık dahil aynı

Harika cevap: basit ama kapsamlı, teşekkürler. Açıkçası, bu durumda FNR ve NR arasındaki fark hiçbir şey değil mi? Ben açıklar man sayfasını okudum : Geçerli kayıt NR sıra numarası & geçerli dosyada geçerli kayıt FNR sıra numarası. Bu durumda bunların eşit olduğunu anlıyorum, sanırım :)
geokrowding

Bir dosyanız varsa, FNR her zaman NR'dir, dosya1'de 10 satır varsa, dosya2'nin ilk satırında NR = 11 ve FNR = 1 olur
Archemar

Merhaba Ben benzer bir şey yapmak istiyorum ama -4 ila 4 aralığında her şeyi kabul etmek istiyorum. Şu anda awk yapmayı düşünebilmemin tek yolu bu, bunu nasıl devam ediyorum '(NR == 1) || (8 $ = [-4-4]) 'foo> bar
Giles

1
awk matematik stil aralığını bilmiyor, benim düzenlememe bakın.
Archemar
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.