Unix 获取数字序列的外部范围
我有一列数字,例如: 2Unix 获取数字序列的外部范围,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, $
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
}