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

#bash

#bash

Вопрос:

Объяснение моего алгоритма:

Я пытаюсь выяснить, совпадает ли моя текущая работа, например, Write (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
 

Комментарии:

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

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

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

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

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

Ответ №1:

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

  1. Чтобы проверить, есть ли r в файле: od -c <filename> | tr ' ' 'n' | grep 'r'
  2. Чтобы удалить мошенническое r использование: tr -d 'r' < filename

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