печатать текущую строку, когда следующая строка становится выше - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь получить текущую строку в столбце 3, если вторая строка увеличилась.Например, это мой входной файл

 9* 2.3 0.3 1.01101  28.8
10* 3   0.3 1.01091  20.8
11* 3   0.3 1.01091  20.8
12* 3.6 0.9 1.00578  20.8
13* 4   0.9 1.00553  0
14* 4   0.9 1.00553  0
15* 4.5 1.4 1.01251  0
18* 6   1.4 1.01334  25
19* 6.5 1.8 1.00742  25
20* 7   1.8 1.00832  8.3
21* 7   1.8 1.00832  8.3
22* 7.6 2.4 1.01134  8.3
23* 8   2.4 1.00443  0
24* 8   2.4 1.00443  0

И я хочу вывод, подобный этому

11* 3   0.3 1.01091 20.8
14* 4   0.9 1.00553 0
18* 6   1.4 1.01334 25
21* 7   1.8 1.00832 8.3
24* 8   2.4 1.00443 0

Итак, если вы заметили, что я выбрал только строку перед следующей строкой, вколонка 3, становится выше.Я попробовал этот скрипт, но кажется, что он работает только тогда, когда предыдущая строка равна следующей строке.

awk  '$3==last{next} {last=$3} 1'

Ответы [ 3 ]

0 голосов
/ 28 мая 2018
$ awk 'NR>1 && $3>p3{print p0} {p3=$3; p0=$0}' file
11* 3   0.3 1.01091  20.8
14* 4   0.9 1.00553  0
18* 6   1.4 1.01334  25
21* 7   1.8 1.00832  8.3

$ awk 'NR>1 && $3>p3{print p0} {p3=$3; p0=$0} END{print p0}' file
11* 3   0.3 1.01091  20.8
14* 4   0.9 1.00553  0
18* 6   1.4 1.01334  25
21* 7   1.8 1.00832  8.3
24* 8   2.4 1.00443  0
0 голосов
/ 28 мая 2018

Если вам интересно, почему ваша команда терпит неудачу, позвольте мне проанализировать ее для вас:

$3==last{next}
{last=$3}
1

По сути, это так:

  • $3==last{next}: если третий столбецравным сохраненному значению last, перейдите к следующей строке
  • {last=$3}: если третий столбец отличается от сохраненного значения last, установите last равным значению третьего столбца.
  • 1: вывести текущую строку.

Как видите, вы печатаете текущую строку, а не предыдущую.Все, что вам нужно было сделать, это сохранить предыдущую строку и распечатать ее (за исключением первой записи).Мы также узнаем, что ваши входные данные четко отсортированы, иначе вы бы не использовали знак равенства.Обновленная версия вашего скрипта будет выглядеть следующим образом:

($3!=last) && (NR>1){print prev}
{last=$3; prev=$0}

Как вы видите, немного изменив логику, мы могли бы переместить оператор печати в первую строку, а затем сохранить предыдущую строку.

0 голосов
/ 27 мая 2018

Решение Perl:

perl -ane 'print $prev if $F[2] > $col3; $col3 = $F[2]; $prev = $_' < file

Не выводит строку 24*, поскольку 2,4 не больше ни к чему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...