Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 使用if-else检查数字序列的连续性_Shell_If Statement_Awk_Fortran - Fatal编程技术网

Shell 使用if-else检查数字序列的连续性

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`

我有一个包含数字的文件,比如说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`
     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你不必在评论中感谢,尽管海报可能很欣赏它。这里的习惯是选择一个答案,如果它解决了你的问题,就将其标记为接受。选择哪一个答案,如果有的话,取决于你自己。