удалить строки, где значение поля меньше или равно 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'

Я предполагаю?

geokrowding
источник

Ответы:

19

Вы почти получили это.

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

где

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

Обратите внимание, что заголовок чередуется от 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 ) ) то же самое, включая заголовок
Archemar
источник
Отличный ответ: простой, но тщательный, спасибо. Просто, чтобы мне было ясно, разница между FNR и NR в этом случае ничто, верно? Я прочитал справочную страницу, где объясняется: порядковый номер NR текущей записи и порядковый номер FNR текущей записи в текущем файле. Так что я понимаю, что в этом случае они равны, я думаю :)
geokrowding
Если у вас есть один файл, FNR всегда равен NR, если file1 имеет 10 строк, первая строка файла2 будет иметь NR = 11 и FNR = 1
Archemar
Привет, я хочу сделать что-то похожее, но принять все в диапазоне от -4 до 4. Как бы я поступил так, поскольку это единственный способ, которым я могу думать в настоящее время, awk '(NR == 1) || ($ 8 = [-4-4]) 'foo> bar
Джайлс
1
awk не знает о диапазоне математических стилей, см. мои правки.
Архемар