在bash中将连续的数字折叠成范围

5
我正在尝试在bash中将连续的数字折叠成范围。例如,如果我的输入文件是:
1
2
3
4
15
16
17
18
22
23
45
46
47

我想要输出为:
1 4
15 18
22 23
45 47

如何使用awk或sed在单行命令中完成这个操作?
谢谢任何帮助!

我的这个回答可能有助于让你大致了解。链接 - Etan Reisner
糟糕!谢谢你发现了这个问题。我编辑了我的问题!抱歉,@EtanReisner,我无法从那个链接中找出如何在一行中打印两行不同的内容。 - arnstrm
你想如何处理单数 1 2 3 4 8 20 21 22 23 24 - gboffi
@gboffi 数据总是成对出现的,因此8在上述字符串中不存在。 - arnstrm
1个回答

10
$ 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}

    在文件结尾处,打印最后一个序列。


非常感谢 @John1024!我真的很感激你为我解释这个问题! - arnstrm
3
关于我对原帖问题的评论(即序列中仅有一个数字8),您的代码输出8 8,在我个人看来这是正确的做法。 - gboffi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接