видалити рядки, у яких значення поля менше або дорівнює 3 - sed або awk?


17

Мені потрібно видалити кожен рядок, який має значення 2 або менше в 8-му полі (стовпці).

Мої дані виглядають так:

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 я можу зняти потрібні значення та надрукувати їх в інший файл, і я розумію, що sed редагував би поточний файл. В будь-якому випадку мені потрібно зберегти оригінальний файл.

Примітка . Будь ласка, надайте ґрунтовні пояснення щодо своїх рішень. Недостатньо лише написати команду, будь ласка, коментуйте пропозиції.

Подальша примітка : Дані мають рядок заголовка, тому, швидше за все, потрібно буде рішення

awk 'FNR> 1'

Я вважаю?

Відповіді:


19

Ви майже отримали це.

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

де

  • NR номер запису (тобто номер рядка)
  • $8 це вісім полів
  • && логічно і
  • foo є оригінальним файлом без змін
  • bar отриманий файл
  • неявна дія за замовчуванням - друк поточного рядка введення

Зауважте, що заголовок смугастий від нижнього кута до смуги, щоб зберегти його

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

де

  • || є логічним або
  • рядок введення друкується, якщо NR == 1 або якщо $ 8> 2

Оновлення №1

Щоб вказати діапазон

  • ( ($8 >= -4) && ( $8 <= 4 ) ) 8-е поле від -4 до 4
  • (NR == 1 ) || ( ($8 >= -4) && ( $8 <= 4 ) ) те саме, включаючи заголовок

Чудова відповідь: простий, але ретельний, дякую. Просто я зрозумів, різниця між FNR і NR в даному випадку нічого, правда? Я прочитав сторінку man, де вона пояснює: порядковий номер NR поточного запису та порядковий номер FNR поточного запису у поточному файлі. Тож я розумію, що в цьому випадку вони рівні, я думаю :)
geokrowding

Якщо у вас є один файл, FNR завжди NR, якщо файл1 має 10 рядків, перший рядок file2 матиме NR = 11, а FNR = 1
Archemar

Привіт, я хочу зробити щось подібне, але прийняти все в діапазоні від 4 до 4. як би я поступив із цим, оскільки це єдиний спосіб, який я можу подумати про те, що роблю це зараз awk '(NR == 1) || ($ 8 = [-4-4]) 'foo> bar
Giles

1
awk не знає про діапазон стилів математики, дивіться мою редагування.
Архемар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.