2015-03-21 3 views
1

Когда я написал ответ на этот question я использовал следующее:AWK - пропустить последнюю строку для состояния

something | sed '$d' | awk '$1>3{print $0}' 

например

  • печати только те строки, где первое поле больше, чем 3 (AWK)
  • но опустить последнюю строку sed '$d'.

Это кажется мне немного дубликата работы, конечно, можно сделать выше, только с awk - без sed?

Я awkdiot - так, может кто-нибудь предложить решение?

ответ

2

Вот один из способов вы можете сделать это:

$ printf "%s\n" {1..10} | awk 'NR>1&&p>3{print p}{p=$1}' 
4 
5 
6 
7 
8 
9 

В основном, печать первого поля линии предыдущего, а не текущий.


Как Wintermute справедливо указал в комментариях (спасибо), чтобы напечатать всю строку, вы можете изменить код для этого:

awk 'p { print p; p="" } $1 > 3 { p = $0 }' 

Это только присваивает содержание содержание линии до p, если первое поле больше 3.

+1

Это работает, только если линия состоит из одного номера. Это не похоже на проблему в случае OP, но разрешите мне в любом случае оставить модифицированную версию 'awk 'p {print p; p = ""} $ 1> 3 {p = $ 0} '', который выбирает строки, основанные на значении поля. (по-прежнему +1, потому что односторонняя печать - это, конечно, способ сделать это) – Wintermute

+0

@Wintermute спасибо за улучшение, отредактировано. –

Смежные вопросы