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

arn*_*trm 4 bash awk sed collapse

我试图将序列号折叠到bash中的范围.例如,如果我的输入文件是

1
2
3
4
15
16
17
18
22
23
45
46
47
Run Code Online (Sandbox Code Playgroud)

我希望输出为:

1 4
15 18
22 23
45 47
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助!

Joh*_*024 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
Run Code Online (Sandbox Code Playgroud)

说明

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

    在第一行,初始化变量first,last然后跳到下一行.

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

    如果此行继续从最后last一行开始,则更新并跳转到下一行.

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

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

  • END{print first,last}

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

  • 关于我对OP问题的评论(即序列中的单个8),你的代码打印"8 8",而我个人的POV则是正确的. (2认同)