在bash中,有没有一种方法可以在整数列表中搜索连续的序列,并除去这些序列中除最后一个数字以外的所有数字?

时间:2019-05-24 18:11:40

标签: bash integer

我的问题是,给定一个整数列表,是否有可能在bash中进行以下操作:a)找到所有连续数字序列,然后b)除去那些序列中除最后一个数字以外的所有数字?

例如,给定此列表并假设数字以每行一个的形式存储在.txt文件中,

001
002
003
005
007
010
011
012

是否有一个可以产生输出的程序/程序集

003
005
007
012

,如果是的话,如何?谢谢您的宝贵时间。

编辑:

这是我到目前为止所拥有的:

#!/bin/bash

cat file.txt | numinterval >> interval.txt

integer=''
while read -u 3 interval
do
    if [[ "$interval" -ne "1" ]]
    then echo "$integer" >> desequenced.txt
    else read -u 4 integer
    fi
done 3< interval.txt 4< file.txt

中心思想是通过numinterval运行排序的整数列表,然后检查numinterval列表是否有任何列表。如果是这样,请移至下一个整数。如果没有,则将相应的整数打印到文件中。


10508
10861
10862
10906
10906
10909
10909
10950
10950
11179
11181
11182
11325
11325
11341
11341
11428
11428



































这是输出。显然出了点问题,因为不仅没有删除连续项,而且列表结束后还有大量空白。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

使用awk的一种方法:

$ awk 'NR > 1 && $0+0 != prev+1 { print prev }
       { prev = $0 }
       END { print prev }' test.txt
003
005
007
012

答案 1 :(得分:0)

我写了这个丑陋的东西。您只需要弄清楚如何创建arr 以及如何漂亮地打印result

arr=( 1 2 3 5 7 10 11 12 )
result=()
k=0
for (( i=0; i<${#arr[@]} - 1 ; i++ )); do
        curArg=${arr[$i]}
        nextArg=${arr[$i+1]}
        if ((curArg != nextArg - 1 )); then
                result+=($curArg)
        fi
done
result+=(${arr[-1]})

答案 2 :(得分:0)

尝试使用这种Shellcheck干净的纯Bash代码:

#! /bin/bash -p

prev=
while read -r curr || [[ -n $curr ]] ; do
    [[ -n $prev ]] && (( 10#$curr != (10#$prev+1) )) && printf '%s\n' "$prev"
    prev=$curr
done <file.txt
[[ -n $prev ]] && printf '%s\n' "$prev"
  • || [[ -n $curr ]]用于使代码能够正常工作,即使输入文件中的最后一行没有终止。参见Read a file line by line assigning the value to a variable
  • 10#10#$curr中的10#$prev前缀将变量内容视为十进制数字。否则010将被视为十进制8而不是十进制10。
  • 不进行检查以确保输入行包含(仅)十进制数字。真正的程序应该进行此类检查。
  • 由于没有检查输入的有效性,因此代码在输入错误的情况下使用'printf'而不是'echo'来减少混淆的可能性。参见Why is printf better than echo?