我正在尝试在bash中将连续的数字折叠成范围。例如,如果我的输入文件是:
我想要输出为:
如何使用awk或sed在单行命令中完成这个操作?
谢谢任何帮助!
1
2
3
4
15
16
17
18
22
23
45
46
47
我想要输出为:
1 4
15 18
22 23
45 47
如何使用awk或sed在单行命令中完成这个操作?
谢谢任何帮助!
1
2
3
4
15
16
17
18
22
23
45
46
47
1 4
15 18
22 23
45 47
$ 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}
在第一行,初始化变量first
和last
,并跳转到下一行。
$1 == last+1 {last=$1;next}
如果这一行继续上一行的序列,更新last
并跳转到下一行。
print first,last;first=$1;last=first
如果我们到达这里,就意味着序列中断了。打印出最后一个序列的范围,并重新初始化变量以开始一个新的序列。
END{print first,last}
在文件结尾处,打印最后一个序列。
8 8
,在我个人看来这是正确的做法。 - gboffi
1 2 3 4 8 20 21 22 23 24
? - gboffi