BASH - цикл (для) с IF через каждую строку из файла - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть файл (halted.txt) с данными, подобными приведенным ниже

IMPORT_FRP_DRAWDOWN_MQ,1
eFXO_IMPORT_RFQ_MQ,1
IMPORT_FROM_MCDM,1
deal_export,1

, и теперь вопрос заключается в том, как зациклить этот файл и выполнить какое-либо действие (добавьте +1 к числу нед)только по одной для каждой строки и останавливаются, когда число равно 5 или> 5

IFS=$'\n' # make newlines the only separator
set -f    # disable globbing

for p in $(cat < "halted.txt"); do
   if [[ $p == *"5"* ]]; then
       echo "There is 5 on the end", $p
   elif [[ $p > *"5"* ]]; then
       echo "add +1 till 5"
       awk -F, '{$2=$2+1}1' OFS=, halted.txt > temp && mv temp halted.txt
   fi
done

В настоящее время номер 1 каждого прогона увеличивается не только на единицу, но и в 4 раза, потому что у меня есть 4 строки внутри файла.тогда первый запуск даст мне

IMPORT_FRP_DRAWDOWN_MQ,4
eFXO_IMPORT_RFQ_MQ,4
IMPORT_FROM_MCDM,4
deal_export,4

, следующий 8 и т. д. Как сделать так, чтобы в качестве результата добавлялся только +1?

1 Ответ

0 голосов
/ 28 февраля 2019

Вы переписываете файл с помощью Awk каждый раз, когда читаете из него другую строку.Просто сделайте все это за один раз с Awk.

if awk -F , 'BEGIN { OFS=FS } ++$NF >= 5 { exit 1 } 1' halted.txt >halted.txt.tmp
then
    mv halted.txt.tmp halted.txt
else
    echo "$0: terminated with error" >&2
    rm halted.txt.tmp # or maybe do this outside the if?
fi

Как правило, вы хотите избежать зацикливания строк в Bash, и особенно обрабатывать весь файл снова и снова в цикле.

ЕслиВы хотите, чтобы Awk завершил обработку, но сообщил об ошибке, попробуйте

if awk -F , 'BEGIN { OFS=FS; rc=0 } ++$NF >= 5 { rc=1 } 1; END { exit rc }' halted.txt >halted.txt.tmp
then
    : nothing
else
    echo "$0: we are done" >&2
fi
mv halted.txt.tmp halted.txt
...