我的问题是,给定一个整数列表,是否有可能在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
这是输出。显然出了点问题,因为不仅没有删除连续项,而且列表结束后还有大量空白。
感谢您的帮助。
答案 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。