Вычтите 2 значения из одного столбца, если 2 поля совпадают в одной строке
Я получил отформатированный файл таким образом:
1 223614 225119.537745 Engine45
2 223614 225121.082392 Engine45
3 223614 225124.440309 Engine45
4 223614 225124.763890 Engine45
5 223621 225124.933927 Engine46
6 223614 225124.934205 Engine45
7 223614 225125.354857 Engine45
8 223614 225127.603434 Engine45
.
.
.
Я пытаюсь сделать awk/shell, который принимает это: 1) проверить столбцы 2 и 4, если они совпадают в одной строке, и, если это применимо, 2) вычесть второе найденное значение в столбце 2 с первым найденным столбцом 1, должно быть так:
1-я строка найдена 1):
1 223614 225119.537745 Engine45
2-я строка найдена 1):
2 223614 225121.082392 Engine45
Вывод должен быть ответом на это:
225121,082392 - 225119,537745 = 1,544647
Следующий вывод должен быть:
3-я строка найти по 1):
3 223614 225124.440309 Engine45
4-я строка найти по 1):
4 223614 225124.763890 Engine45
Выход: 225124,763890 - 225124,440309 = 0,323581.
И последовательно со всеми записями в файле.
Я верю, что 1) я мог бы заставить это работать, но 2) мне действительно тяжело, но если кто-то может дать подсказку, как получить, может быть очень полезным, я знаю основы из shell и awk, если это помогает, но я открыт чтобы сделать на других инструментах, таких как Perl.
С уважением
2 ответа
Если значения двух последовательных строк не совпадают, и вы хотите пропустить строки, то вы можете сделать:
awk '!(NR%2) && $2==col2 && $4==col4{print $3-col3}{col2=$2;col3=$3;col4=$4}' file
1.54465
0.323581
2.24858
Если вы не хотите пропускать строки и печатать 3-й столбец как есть, тогда вы можете сделать:
awk '!(NR%2){print(($2==col2&&$4==col4)?$3-col3:col3 RS $3)}{col2=$2;col3=$3;col4=$4}' file
1.54465
0.323581
225124.933927
225124.934205
2.24858
Вы не указали, что делать, если значения не равны. Вы хотите пропустить 2 строки? Или только один из них и искать совпадение?
Вот решение Perl, которое пропускает обе строки:
perl -e '
while (1) {
@first = split " ", <>;
@second = split " ", <>;
print $second[2] - $first[2], "\n" if $first[1] == $second[1] and $first[3] == $second[3];
last if eof;
}' input-file