首页 > 解决方案 > BASH - 通过文件中的每一行使用 IF 循环(for)

问题描述

我有如下数据的文件(halted.txt)

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

现在的问题是如何循环这个文件并执行一些操作(将+1添加到ned的数量)每行只有一个,并在数字为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 不仅增加了 1 倍,而且增加了 4 倍,因为我在文件中有 4line。那么第一次运行会给我

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

下一个 8 等。如何确保只添加 +1 作为结果?

标签: bashloopsfor-loopif-statement

解决方案


每次从文件中读取另一行时,您都在用 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

推荐阅读