Группировка данных на основе двух логик - PullRequest
0 голосов
/ 12 марта 2020

У меня огромный текстовый файл из 4 столбцов. Первый столбец представляет собой серийный номер, второй и третий столбцы являются координатами, а 4-й столбец является значением. Это значения переменной в узлах ячейки. Я хотел бы усреднить 4 узловых значения, чтобы получить значение ячейки, которое будет прочитано моим кодом. Например, давайте рассмотрим декартову ячейку 3 на 3 со следующими данными:

1     0.     0.     5e-4
2     0.1     0.     5e-3
3     0.2     0.     5e-4
4     0.3     0.     5e-3
5     0.     0.1     5e-5
6     0.1     0.1     5e-7
7     0.2     0.1     5e-5
8     0.3     0.1     5e-2
9     0.     0.2     5e-4
10     0.1     0.2     5e-3
11     0.2     0.2     5e-4
12     0.3     0.2     5e-3
13     0.     0.3     5e-5
14     0.1     0.3     5e-7
15     0.2     0.3     5e-5
16     0.3     0.3     5e-2

Я хотел бы сгруппировать строки в следующем порядке:

1     0.     0.     5e-4
2     0.1     0.     5e-3
5     0.     0.1     5e-5
6     0.1     0.1     5e-7
2     0.1     0.     5e-3
3     0.2     0.     5e-4
6     0.1     0.1     5e-7
7     0.2     0.1     5e-5
3     0.2     0.     5e-4
4     0.3     0.     5e-3
7     0.2     0.1     5e-5
8     0.3     0.1     5e-2
5     0.     0.1     5e-5
6     0.1     0.1     5e-7
9     0.     0.2     5e-4
10     0.1     0.2     5e-3
6     0.1     0.1     5e-7
7     0.2     0.1     5e-5
10     0.1     0.2     5e-3
11     0.2     0.2     5e-4 and so on ...

В приведенный выше пример. Во-первых, данные строк (1,2,5,6 и 2,3,6,7 и 3,4,7,8) образуют один набор (первый ряд моего я sh). Далее следуют строки (5,6,9,10), где мы переходим к следующей строке данных. Затем первый лог c продолжается снова (6,7,10,11 и 7,8,11,12 и т. Д.).

Я использовал следующую команду «sed» для извлечения группы строк, но делать это по отдельности громоздко, учитывая объем данных, с которыми мне приходится работать:

sed -n -e 1,2p -e 5,6p fileName

Как я могу создать oop, учитывая обе логики, которые я упомянул выше?

1 Ответ

0 голосов
/ 12 марта 2020

Это может работать для вас (GNU sed):

sed -n ':a;N;s/\n/&/5;Ta;P;s/[^\n]*\n//;h;P;s/.*\n\(.*\n.*\)/\1/p;g;ba' file |
sed '13~12,+3d'

Это соответствует шаблону равномерно, то есть строки 1,2, за которыми следуют строки 5,6, строки 2,3, затем строки 6,7 и др c. Результат передается во второй вызов sed, который удаляет 4 строки через каждые 12 строк, начиная со строки 13.

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