如何在Shell中对重复数据的范围进行排序

时间:2016-01-08 14:12:11

标签: bash shell awk sed grep

我有一个值列表:

2016-01-04T16-01-56,7
2016-01-04T16-01-57,0
2016-01-04T16-02-49,7
2016-01-04T16-03-15,7
2016-01-04T16-03-42,28
2016-01-04T16-04-37,28
2016-01-04T16-05-03,0
2016-01-04T16-05-28,0
2016-01-04T16-06-21,0
2016-01-04T16-06-46,0

结果我想得到:

Entries1:
BEGIN: 2016-01-04T16-01-56,7
END: 2016-01-04T16-01-56,7
Entries2:
BEGIN: 2016-01-04T16-02-49,7
END: 2016-01-04T16-03-15,7
Entries3:
BEGIN: 2016-01-04T16-03-42,28
END: 2016-01-04T16-04-37,28

有没有人知道实现这一目标的最简单方法?

注意:0值不感兴趣,只有> 0

目前我有一个脚本将所有条目放在数组中并扫描数组中的每个项目。这种方式非常慢,因为有很多“if”语句。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

目前尚不清楚你要做什么,但这可能会解决你的问题。

#!/bin/bash

entry=1
for file in "$@"; do
    prev=''
    while read -r -s line; do
        num="${line##*,}"
        if [[ "$num" != "0" && "$prev" == "" ]]; then
            prev=$line
        elif [[ "$num" != "0" || "$prev" != "" ]]; then
            if [[ "$num" == "0" ]]; then
                line=$prev
            fi
            echo "Entries${entry}"
            echo "BEGIN: $prev"
            echo "END: $line"
            entry=$((entry + 1))
            prev=''
        fi
    done < $file
done

产生以下输出:

Entries1
BEGIN: 2016-01-04T16-01-56,7
END: 2016-01-04T16-01-56,7
Entries2
BEGIN: 2016-01-04T16-02-49,7
END: 2016-01-04T16-03-15,7
Entries3
BEGIN: 2016-01-04T16-03-42,28
END: 2016-01-04T16-04-37,28

如果这不是您想要的,请澄清您希望遵循的规则。