Как сравнить, имеют ли два числа разницу между ними в 1 число?

Объясняю свой алгоритм:

Я пытаюсь выяснить, является ли Моя текущая работа, например. Запись (W) совпадает с моей предыдущей работой, если моя текущая работа (W) такая же, как моя предыдущая работа (W), то проверьте, есть ли разница между ними в 1 целое число, например. если предыдущее задание было W9, а мое текущее задание — W8 или W10, то добавьте 0 к моему массиву поиска.

Я перепробовал почти все способы, которые смог найти в Интернете, для сравнения целых чисел, но ни один из них не работает, я продолжаю получать недопустимую арифметическую синтаксическую ошибку при попытке сравнить текущую и предыдущую работу.

Есть идеи?

# Jobs
lastJob = ""
currentJob = ""
lastNumber=0
currentNumber=0

# Arrays 
seek=()
RW=()
shift 3
# Reads final into array
while IFS= read -r line
do
        Job+=($line)
done < ./sim.job

#-----------------------------------
# Single HDD Algorithm
#-----------------------------------
for (( i=0; i<=${#Job[@]}; i++ ));
do 
        currentString = "${Job[$i]}"
        currentJob=${currentString:0:1}
        currentNumber=${currentString:1:3}

        if [[ $currentJob == $lastJob ]]
        then    
                if [[ $currentNumber -eq $lastNumber-1 ]] || [[ $currentNumber -eq $lastNumber+1 ]]
                then
                        seek+=(0)
                        RW+=(60)
                else
                        seek+=(5)
                        RW+=(60)
                fi
        else
                        seek+=(5)
                        RW+=(60)  
        fi

        lastString = "${Job[$i]}"
        lastJob=${lastString:0:1}
        lastNumber=${currentString:1:3}
done

Это печатает вывод:

#-----------------------------------
# Print Information
#-----------------------------------
for (( i=0; i<${#Job[@]}; i++ ));
do
        echo -e "${Job[$i]}:${seek[$i]}:${RW[$i]}"
done

Ожидаемый результат:

R9:5:60
W9:5:60
W10:0:60
R11:0:60
R13:5:60
R18:5:60
R19:0:60
R20:0:60
R21:0:60

Фактический результат:

") syntax error: invalid arithmetic operator (error token is "
R9:5:60
W9:5:60
W10::
R11::
R13::
R18::
R19::
R20::
R21::

Файл sim.job (вход):

R9
W9
W10
R11
R13
R18
R19
R20
R21

Без ввода я не думаю, что мы будем очень полезны, поэтому, пожалуйста, отредактируйте свой вопрос, чтобы включить пример того, как это выглядит. Но обратите внимание, что в середине сообщения об ошибке есть возврат каретки (поэтому он возвращается в левую часть экрана и перезаписывает начало сообщения концом) — это может помочь удалить их из вашего входного файла. .

Mark Reed 12.12.2020 04:03

@MarkReed Я включил входной файл

Ceiun 12.12.2020 04:06

код работает для меня, и я получаю желаемый результат без каких-либо сообщений об ошибках; в соответствии с тем, что упоминал @MarkReed, мне интересно, есть ли мошенник \r где-то в миксе ... если не в файле данных, то, возможно, в самом сценарии оболочки; как для sim.job, так и для вашего сценария оболочки od -c <filename> | tr ' ' '\n' | grep '\r' возвращает какие-либо строки \r? если это так, рассмотрите возможность запуска dos2unix <filename>, а затем снова запустите od/tr/grep, чтобы увидеть, исчез ли \r; в качестве альтернативы, перейдите прямо к dos2unix <filename> и посмотрите, работает ли скрипт без ошибок

markp-fuso 12.12.2020 04:16

@markp-fuso sim.job came back with 9x " /r "HDD.sh came back with 46 " r " без обратной косой черты, я пытался удалить строки "\r" с помощью dos2unix, но команда не распознается, и у меня нет доступа к администратору..

Ceiun 12.12.2020 04:27

Я предполагаю, что ваш /r был опечаткой и должен быть \r; вы можете эмулировать часть удаления символов dos2unix с помощью tr -d '\r' < filename; в то время как dos2unix заменит исходный файл, вам нужно будет направить вывод из tr в новый файл, а затем переместить этот файл обратно, чтобы перезаписать оригинал (очевидно, убедитесь, что новый файл выглядит хорошо, прежде чем перемещать/перезаписывать исходный файл); еще лучше, переместите исходный файл в сторону ... mv srcfile srcfile.dos (?) ... пока вы не подтвердите, что он вам больше не нужен

markp-fuso 12.12.2020 04:36

@markp-fuso tr -d '\r' < sim.job > sim.job это устранило проблему ... Я только что потратил 4 часа своей жизни на отладку кода, который уже работал ..

Ceiun 12.12.2020 04:38

приятно слышать, что это сработало, хотя я всегда немного сомневаюсь, чтобы одна команда использовала одно и то же имя файла для ввода и вывода (да, я знаю, что в некоторых случаях это «нормально», но обычно это плохая привычка получать в потому что однажды вы перезапишете/сотрете какой-нибудь большой файл — возможно, тот скрипт, который вы потратили на «доводку» 3 дня? — его будет трудно перегенерировать); что касается потраченных впустую 4 часов сегодня ... надеюсь, это окупится в будущем, когда вы увидите \r поведение ... «ах, да, мне нужно запустить dos2unix на этом» (или «что это была за tr команда, которую мне сказал markp использовать?")

markp-fuso 12.12.2020 04:43

Да, чтобы повторить то, что сказал @markp, более безопасный способ сделать это будет что-то вроде tr -d '\r' < sim.job >sim.job.tmp && mv sim.job.tmp sim.job. Или, что еще лучше, mv sim.job sim.job.bak && tr -d '\r' <sim.job.bak >sim.job так что у вас все еще есть резервная копия файла pre-tr на случай, если вы напортачите с командой.

Mark Reed 12.12.2020 22:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

мошенники \r были найдены в моем входном файле, для решения этой проблемы я использовал команды:

  1. Чтобы проверить, есть ли \r в файле: od -c <filename> | tr ' ' '\n' | grep '\r'

  2. Чтобы удалить мошенника \r используйте: tr -d '\r' < filename

Еще раз спасибо @mark-fuso

Другие вопросы по теме