hapus baris di mana nilai bidang kurang dari atau sama dengan 3 - sed atau awk?

17

Saya perlu menghapus setiap baris yang memiliki nilai 2 atau kurang di bidang ke-8 (kolom).

Data saya terlihat seperti ini:

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

Saya mengerti bahwa menggunakan awk saya dapat menghapus nilai yang diinginkan dan mencetaknya ke file lain, dan saya mengerti bahwa sed akan mengedit file saat ini. Dalam kedua kasus, saya perlu menyimpan file asli.

Catatan : Harap berikan penjelasan menyeluruh dengan solusi Anda. Tidak cukup hanya menulis perintah, tolong beri anotasi saran.

Catatan lebih lanjut : Data memiliki garis tajuk, jadi kemungkinan besar solusi perlu

awk 'FNR> 1'

Saya seharusnya?

geokrowding
sumber

Jawaban:

19

Anda hampir mendapatkannya.

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

dimana

  • NR adalah jumlah record (yaitu jumlah baris)
  • $8 adalah delapan bidang
  • && logis dan
  • foo adalah file asli, tidak berubah
  • bar file yang dihasilkan
  • tindakan standar implisit adalah untuk mencetak jalur input saat ini

Perhatikan bahwa header bergaris dari foo ke bar, untuk menyimpannya

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

dimana

  • || logis atau
  • baris input dicetak jika NR == 1 atau jika $ 8> 2

Perbarui # 1

Untuk menentukan rentang

  • ( ($8 >= -4) && ( $8 <= 4 ) ) Bidang 8 dari -4 hingga 4
  • (NR == 1 ) || ( ($8 >= -4) && ( $8 <= 4 ) ) sama, termasuk tajuk
Archemar
sumber
Jawaban yang bagus: sederhana namun menyeluruh, terima kasih. Asal saya jelas, perbedaan antara FNR dan NR dalam hal ini tidak ada, benar? Saya telah membaca halaman manual yang menjelaskan: Nomor urut NR dari catatan saat ini & Nomor urut FNR dari catatan saat ini dalam file saat ini. Jadi saya mengerti ini sama dalam hal ini, saya pikir :)
geokrowding
Jika Anda memiliki satu file, FNR selalu NR, jika file1 memiliki 10 baris, baris pertama file2 akan memiliki NR = 11 dan FNR = 1
Archemar
Hai Saya ingin melakukan sesuatu yang serupa tetapi menerima semuanya dalam kisaran -4 hingga 4. bagaimana saya akan melakukan ini, karena ini adalah satu-satunya cara saya bisa memikirkan melakukannya saat ini awk '(NR == 1) || ($ 8 = [-4-4]) bar 'foo>
Giles
1
awk tidak tahu tentang rentang gaya matematika, lihat edit saya.
Archemar