首页 > 解决方案 > 基于两种逻辑对数据进行分组

问题描述

我有一个巨大的 4 列文本文件。第一列是序列号,第二列和第三列是坐标,第四列是值。这些是单元节点处变量的值。我想平均 4 个节点值以获取我的代码要读取的单元格值。例如,让我考虑具有以下数据的 3 x 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)形成一组(我的网格的第一行)。紧随其后的是行 (5,6,9,10),我们在其中继续下一行数据。然后第一个逻辑再次继续(6,7,10,11 和 7,8,11,12 等等......)。

我使用以下“sed”命令来提取一组行,但考虑到我必须处理的数据大小,单独执行此操作很麻烦:

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

考虑到我上面提到的两种逻辑,我如何创建一个循环?

标签: sortingsed

解决方案


这可能对您有用(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 行等。结果被传递给 sed 的第二次调用,从第 13 行开始每 12 行删除 4 行.


推荐阅读