【问题标题】:Collapse sequential numbers to ranges in bash将序列号折叠到bash中的范围
【发布时间】:2015-01-04 17:48:35
【问题描述】:

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

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

我希望输出为:

1 4
15 18
22 23
45 47

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

感谢您的帮助!

【问题讨论】:

  • This answer of mine 可能有助于为您提供一般的想法。
  • 哎呀!谢谢你明白了。我编辑了我的问题!抱歉,@EtanReisner,我不知道如何在该链接的一行中打印 2 行不同的行。
  • 你想如何处理一个单数号码1 2 3 4 8 20 21 22 23 24
  • @gboffi 数据总是成对出现,因此,8 不会存在(在上面的字符串中)。

标签: bash awk sed collapse


【解决方案1】:
$ 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!非常感谢您向我解释它的努力!
  • 关于我对 OP 问题的评论(即序列中的单个 8),您的代码打印 8 8 并且从我个人的 POV 来看,这是正确的做法。
猜你喜欢
  • 2012-06-03
  • 2017-06-04
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多