Выберите текущую и предыдущую строку, если определенное значение найдено - PullRequest
0 голосов
/ 12 февраля 2019

Чтобы выяснить мою проблему, я вычитаю столбец 3 и создаю новый столбец 5 с новыми значениями, затем печатаю предыдущую и текущую строку, если найденное значение равно 25 в столбце 5.

Входной файл

1   1   35  1
2   5   50  1
2   6   75  1
4   7   85  1
5   8   100 1
6   9   125 1
4   1   200 1

Я пытался

awk '{$5 = $3 - prev3; prev3 = $3; print $0}' file

вывод

1 1 35 1 35
2 5 50 1 15
2 6 75 1 25
4 7 85 1 10
5 8 100 1 15
6 9 125 1 25
4 1 200 1 75

Требуемый вывод

2 5 50 1 15
2 6 75 1 25
5 8 100 1 15
6 9 125 1 25

Заранее спасибо

Ответы [ 4 ]

0 голосов
/ 12 февраля 2019

Не могли бы вы попробовать следующее.

awk '$3-prev==25{print line ORS $0,$3} {$(NF+1)=$3-prev;prev=$3;line=$0}' Input_file | column -t
0 голосов
/ 12 февраля 2019

Вы близки к ответу, просто передайте ему другой awk и напечатайте его

awk '{$5 = $3 - prev3; prev3 = $3; print $0}' oxxo.txt  | awk  ' { curr=$0; if($5==25) { print prev;print curr } prev=curr } '

с входами:

$ cat oxxo.txt
1   1   35  1
2   5   50  1
2   6   75  1
4   7   85  1
5   8   100 1
6   9   125 1
4   1   200 1

$ awk '{$5 = $3 - prev3; prev3 = $3; print $0}' oxxo.txt  | awk  ' { curr=$0; if($5==25) { print prev;print curr } prev=curr } '
2 5 50 1 15
2 6 75 1 25
5 8 100 1 15
6 9 125 1 25

$
0 голосов
/ 12 февраля 2019

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

$ awk '{$5=$3-p3} $5==25{print p0; print} {p0=$0;p3=$3}' file

2 5 50 1 15
2 6 75 1 25
5 8 100 1 15
6 9 125 1 25

это может быть увеличено до

$ awk '25==($5=$3-p3){print p0; print} {p0=$0;p3=$3}' file

проверьте только что вычисленное поле $5 равным 25. Если это так, выведите предыдущую и текущую строки.Сохраните предыдущую строку и предыдущие 3 доллара для вычислений в следующей строке.

0 голосов
/ 12 февраля 2019

Вот один из них:

$ awk '{$5=$3-q;t=p;p=$0;q=$3;$0=t ORS $0}$10==25' file
2 5 50 1 15
2 6 75 1 25
5 8 100 1 15
6 9 125 1 25

Объяснено:

$ awk '{
    $5=$3-q      # subtract
    t=p          # previous to temp
    p=$0         # store previous for next round
    q=$3         # store subtract value for next round
    $0=t ORS $0  # prepare record for output
}
$10==25          # output if equals
' file

Не нужно проверять дубликаты, поэтому одну и ту же запись можно напечатать дважды.Самый простой способ исправить это направить вывод на uniq.

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