将序列号折叠到bash中的范围

时间:2014-11-07 20:36:30

标签: bash awk sed collapse

我正在尝试将序号折叠到bash中的范围。例如,如果我的输入文件是

1
2
3
4
15
16
17
18
22
23
45
46
47

我希望输出为:

1 4
15 18
22 23
45 47

如何在单行命令中使用awk或sed执行此操作?

感谢您的帮助!

1 个答案:

答案 0 :(得分:6)

$ awk 'NR==1{first=$1;last=$1;next} $1 == last+1 {last=$1;next} {print first,last;first=$1;last=first} END{print first,last}' file
1 4
15 18
22 23
45 47

解释

  • NR==1{first=$1;last=$1;next}

    在第一行,初始化变量firstlast并跳到下一行。

  • $1 == last+1 {last=$1;next}

    如果此行在最后一个序列中继续,请更新last并跳转到下一行。

  • print first,last;first=$1;last=first

    如果我们到达这里,我们就会有一个突破。打印出最后一个序列的范围,并重新初始化新序列的变量。

  • END{print first,last}

    在我们到达文件末尾后,打印最后的序列。