linux - 如何根据多个不同列的增加值对多个值范围进行排序?
问题描述
我在对 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
你能就此提出建议吗?
解决方案
您要分组的列式数据行并查找诸如列尖叫数据库的最小值和最大值之类的内容。所以......脚本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
推荐阅读
- node.js - Nodemailer 抛出错误 Invalid login: 534-5.7.14
- vba - 如果我不选择单元格,图表将不起作用
- scala - 为什么我不能在 Scala 中将 String 的实例转换为 Iterable[Char]
- java - 使用 selenium(java) 和 fiddler 模拟 API
- python - 是否可以从python中的集合中丢弃数字字符串(仅包含数字的字符串)?
- python-3.x - Python递归图遍历拒绝工作并给出运行时错误
- ios - swift 4中变量的密码加密
- swift - Swift:扩展序列,其中 Iterator.Element 是泛型类型
- css - CSS 位置属性说明
- ionic3 - Ionic 3:社交分享中的深层链接不起作用