BASH-通过文件的每一行(如果有)循环

时间:2019-02-28 06:30:02

标签: bash loops for-loop if-statement

我有文件(halted.txt),其数据如下所示

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

现在的问题是如何针对此文件循环并仅对每行执行一些操作(在ned的编号上加上+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不仅增加了1,而且增加了4倍,因为文件中有4行。那么第一轮就会给我

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

下一个8等 如何确保仅将+1添加为结果?

1 个答案:

答案 0 :(得分:0)

每次您从Awk中读取另一行时,都将使用Awk重写该文件。与Awk一起完成所有操作。

<input type="submit" value="Submit" onclick="addData(); return false;">

通常,您要避免循环遍历Bash中的行,尤其是要在循环中一次又一次地处理整个文件。

如果您希望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