Unix 获取数字序列的外部范围

Unix 获取数字序列的外部范围,unix,awk,Unix,Awk,我有一列数字,例如: 2 3 4 5 8 9 十, 我想为我的数字列输出类似于2-5和8-10的内容。这看起来并不难,但我缺乏技巧。使用awk,我试图创建一列差异,如下面所示,并使用它来捕获范围,但无法使事情正常进行 20 31 4.1 5.1 8.3 9.1 101 startNumber=$1 {如果($2>1){打印“开始编号”,开始编号}否则{ 如果($2这样的东西应该有用 $ awk '1{if (NR==1) {a=$0; print $0, 0} else {print $0, $

我有一列数字,例如:

2
3
4
5
8
9
十,

我想为我的数字列输出类似于2-5和8-10的内容。这看起来并不难,但我缺乏技巧。使用awk,我试图创建一列差异,如下面所示,并使用它来捕获范围,但无法使事情正常进行

20
31
4.1
5.1
8.3
9.1
101

startNumber=$1
{如果($2>1){打印“开始编号”,开始编号}否则{

如果($2这样的东西应该有用

$ awk '1{if (NR==1) {a=$0; print $0, 0} else {print $0, $0-a; a=$0}}' test
2 0
3 1
4 1
5 1
8 3
9 1
10 1
像这样的

awk '{print $1,$1-a;a=$1}' file
2 2
3 1
4 1
5 1
8 3
9 1
10 1
如果您喜欢2之后的0,可以执行以下操作:

awk 'NR==1 {a=$1} {print $1,$1-a;a=$1}' file
2 0
3 1
4 1
5 1
8 3
9 1
10 1
你也可以试试

awk -f range.awk input.txt
在哪里

input.txt
是您的输入文件,
range.awk

NR==1 { first=$1; prev=first; next }
{
    if ($1-prev != 1) {
        if (f) printf "%d-%d\n",first,prev
        first=$1; f=0
    } else f=1
    prev=$1; 
}
END {
    if (f) printf "%d-%d\n",first,prev
}

给定输入
1-3-5
,这将输出
1-1
3-3
5-5
。您只需调整打印,以便在
prev==first
时打印一个数字,否则打印两个数字。@JonathanLeffler已更新。我认为您需要
if(f)printf“%d-%d\n”,first,prev
,而不是
if(prev==first)printf“%d\n”,首先;否则printf“%d-%d\n”首先,prev;
。使用
f
的修订版不会为135生成任何输出。@JonathanLeffler当然,我明白你的意思。我刚刚意识到我对预期输出的想法是错误的。无论如何,我想我不会更新答案,因为这可能只是一个小问题。我希望原始海报能够理解他想要什么。
NR==1 { first=$1; prev=first; next }
{
    if ($1-prev != 1) {
        if (f) printf "%d-%d\n",first,prev
        first=$1; f=0
    } else f=1
    prev=$1; 
}
END {
    if (f) printf "%d-%d\n",first,prev
}