Есть ли способ, в bash, найти список целых чисел для последовательных последовательностей и удалить все, кроме последних чисел в этих последовательностях? - PullRequest
2 голосов
/ 24 мая 2019

Мой вопрос, учитывая список целых чисел, возможно ли в bash: а) найти все последовательности последовательных чисел, а затем б) удалить все, кроме последних чисел в этих последовательностях?

Например, учитывая этот список и предполагая, что числа сохраняются, по одному на строку, в текстовом файле,

001
002
003
005
007
010
011
012

есть ли программа / набор программ, которые будут производить вывод

003
005
007
012

и если да, то как? Спасибо за ваше время.

EDIT:

Вот что у меня есть:

#!/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 ]

2 голосов
/ 25 мая 2019

В одну сторону, используя awk:

$ awk 'NR > 1 && $0+0 != prev+1 { print prev }
       { prev = $0 }
       END { print prev }' test.txt
003
005
007
012
0 голосов
/ 28 мая 2019

Попробуйте 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 ]], чтобы код работал, даже если последняя строка во входном файлене прекращеноСм. Считывание файла построчно, присваивая значение переменной .
  • Префикс 10# в 10#$curr и 10#$prev заставляет содержимое переменной обрабатываться как десятичные числа.В противном случае 010 будет считаться десятичным 8 вместо десятичного 10.
  • Не выполняется никаких проверок, чтобы гарантировать, что входные строки содержат (только) десятичные числа.Настоящая программа должна выполнять такие проверки.
  • Поскольку проверки достоверности ввода не выполняются, код использует printf вместо echo, чтобы уменьшить вероятность путаницы, если ввод неправильный.См. Почему printf лучше, чем echo? .
0 голосов
/ 24 мая 2019

Я написал эту ужасную вещь.Вам просто нужно выяснить, как создать 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]})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...