Shell 使用if-else检查数字序列的连续性
我有一个包含数字的文件,比如说1到300。但这些数字并不是连续的。示例文件如下所示Shell 使用if-else检查数字序列的连续性,shell,if-statement,awk,fortran,Shell,If Statement,Awk,Fortran,我有一个包含数字的文件,比如说1到300。但这些数字并不是连续的。示例文件如下所示 042 043 044 045 078 198 199 200 201 202 203 212 213 214 215 238 239 240 241 242 256 257 258 num=`cat file | wc -l` out1=`head -1 file` for ((i=2;i<=$num;i++)) do j=`echo $i-1 | bc`
042
043
044
045
078
198
199
200
201
202
203
212
213
214
215
238
239
240
241
242
256
257
258
num=`cat file | wc -l`
out1=`head -1 file`
for ((i=2;i<=$num;i++))
do
j=`echo $i-1 | bc`
var1=`cat file | awk 'NR='$j'{print}'`
var2=`cat file | awk 'NR='$i'{print}'`
var3=`echo $var2 - $var1 | bc`
if [ $var3 -gt 1 ]
then
out2=$var1
echo $out1-$out2
out1=$var2
fi
done
现在我需要检查数字序列的连续性,并相应地写出输出。例如,前4个数字是串联的,因此输出应该是
042-045
078
198-203
接下来,078是一个单独的数字,因此输出应该是
042-045
078
198-203
为了方便起见,可以使其看起来像
078-078
那么198到203是连续的。所以,下一个输出应该是
042-045
078
198-203
等等。最终输出应该是
042-045
078-078
198-203
212-215
238-242
256-258
我只需要知道连续序列的第一个和最后一个成员,并在遇到不连续时跳到下一个序列;输出可以被操纵。我倾向于使用if语句,可以想到这样一个复杂的事情
042
043
044
045
078
198
199
200
201
202
203
212
213
214
215
238
239
240
241
242
256
257
258
num=`cat file | wc -l`
out1=`head -1 file`
for ((i=2;i<=$num;i++))
do
j=`echo $i-1 | bc`
var1=`cat file | awk 'NR='$j'{print}'`
var2=`cat file | awk 'NR='$i'{print}'`
var3=`echo $var2 - $var1 | bc`
if [ $var3 -gt 1 ]
then
out2=$var1
echo $out1-$out2
out1=$var2
fi
done
num=`cat文件| wc-l`
out1=`head-1文件`
对于((i=2;i此awk单衬套适用于给定示例:
awk 'p+1!=$1{printf "%s%s--",NR==1?"":p"\n",$1}{p=$1}END{print $1}' file
它将数据的输出作为输入:
042--045
078--078
198--203
212--215
238--242
256--258
下面是一个用Fortran编写的简单程序:
program test
implicit none
integer :: first, last, uFile, i, stat
open( file='numbers.txt', newunit=uFile, action='read', status='old' )
read(uFile,*,iostat=stat) i
if ( stat /= 0 ) stop
first = i ; last = i
do
read(uFile,*,iostat=stat) i
if ( stat /= 0 ) exit
if ( i == last+1 ) then
last = i
else
print *,first,'-',last
write(*,'(i3.3,a,i3.3)') first,'-',last
endif
enddo
write(*,'(i3.3,a,i3.3)') first,'-',last
end program
输出是
042-045
078-078
198-203
212-215
238-242
256-258
非常感谢@Kent。这就是我要找的。@HimangshuPaul你不必在评论中感谢,尽管海报可能很欣赏它。这里的习惯是选择一个答案,如果它解决了你的问题,就将其标记为接受。选择哪一个答案,如果有的话,取决于你自己。