首页 > 解决方案 > 如何根据多个不同列的增加值对多个值范围进行排序?

问题描述

我在对 input.txt 文件中的某些值进行排序时遇到问题,但我仍然不知道如何解决它。

输入文件(input.txt):

1 5 1 2183 2006 6001 6132
1 6 1 2183 2006 6001 6133
1 7 1 2183 2006 6001 6134
...
1 65 1 2183 2006 6001 6227
1 66 1 2183 2006 6001 6234
1 67 1 2183 2006 6001 6235
1 68 1 2183 2006 6004 6156
1 69 1 2183 2006 6004 6157
1 70 1 2183 2006 6004 6158
...
1 115 1 2183 2006 6004 6227
1 116 1 2183 2006 6004 6234
1 117 1 2183 2006 6004 6235
1 118 1 2183 2006 6007 6120
1 119 1 2183 2006 6007 6146
1 120 1 2183 2006 6007 6147
...
1 182 1 2183 2006 6007 6237
1 183 1 2183 2006 6007 6238
1 184 1 2183 2006 6007 6239

所需的输出文件(output.txt):

1 2183 2006 5-67 6001 6132 6235
1 2183 2006 68-117 6004 6156 6235
1 2183 2006 118-184 6007 6120 6239

输入文件中有 7 列/字段。第 1、3、4、5 列应该是常数值。而第 2 列和第 6 列的变化取决于第 7 列。第 6 列的增量值为 3,第 7 列的变化各不相同,仅在最后 3 位上发生变化;例如 6 132、 6 133、 6 134

诀窍在于输出第 4 列,如何根据输入第 6 列和第 7 列的变化对其进行排序和取消排序?

假设如果:

输入列 6 (6001) 和输入列 7 (6132) 到达下一个输入列 6 (6004) 和输入列 7 (6235) 之前的最后一个值

那么,最终输出第 4 列的值应为 5-67,输出第 5 列应具有相同的值 6001,输出第 6 列应具有第一个输入列 7,输出第 7 列(6132)应具有最后一个输入列 7( 6235)。

Example 1st batch:

Input:
1 5 1 2183 2006 6001 6132
1 6 1 2183 2006 6001 6133
1 7 1 2183 2006 6001 6134
...
1 65 1 2183 2006 6001 6227
1 66 1 2183 2006 6001 6234
1 67 1 2183 2006 6001 6235

Desired Output:
1 2183 2006 5-67 6001 6132 6235


Example 2nd batch:
Input:
1 68 1 2183 2006 6004 6156
1 69 1 2183 2006 6004 6157
1 70 1 2183 2006 6004 6158
...
1 115 1 2183 2006 6004 6227
1 116 1 2183 2006 6004 6234
1 117 1 2183 2006 6004 6235

Desired Output:
1 2183 2006 68-117 6004 6156 6235


Example 3rd batch:

Input:
1 118 1 2183 2006 6007 6120
1 119 1 2183 2006 6007 6146
1 120 1 2183 2006 6007 6147
...
1 181 1 2183 2006 6007 6236
1 182 1 2183 2006 6007 6237
1 183 1 2183 2006 6007 6238
1 184 1 2183 2006 6007 6239

Desired Output:
1 2183 2006 118-184 6007 6120 6239

编译所需的输出后,它应该如下所示:

1 2183 2006 5-67 6001 6132 6235
1 2183 2006 68-117 6004 6156 6235
1 2183 2006 118-184 6007 6120 6239

你能就此提出建议吗?

标签: linuxshellperlawk

解决方案


您要分组的列式数据行并查找诸如列尖叫数据库的最小值和最大值之类的内容。所以......脚本sqlite3:

#!/bin/sh
sqlite3 -batch -noheader -list -separator ' ' <<EOF
CREATE TABLE data(c1 INTEGER, c2 INTEGER, c3 INTEGER, c4 INTEGER
                , c5 INTEGER, c6 INTEGER, c7 INTEGER);
.import "$1" data
SELECT c1, c4, c5, min(c2) || '-' || max(c2), c6, min(c7), max(c7)
FROM data GROUP BY c6 ORDER BY c6;
EOF

使用您的示例输入:

$ ./doit.sh input.txt
1 2183 2006 5-67 6001 6132 6235
1 2183 2006 68-117 6004 6156 6235
1 2183 2006 118-184 6007 6120 6239

推荐阅读