从每个单独行中都有整数值的文件中读取,然后如果满足条件则执行语句

从每个单独行中都有整数值的文件中读取,然后如果满足条件则执行语句

我有一个文本文件,其中只有整数值,即不同行中的不同整数(例如从 1 到 47)。我制作了一个脚本,可以读取每一行并获取不同行中存在的值。如果满足条件,那么我想回显一个声明。

的内容a.txt:(一行中只有 1 个,第二行中只有 2 个)1 2 3 4 5 ..如此直到 47。

输出我想要:一旦它显示为 5. 输出 - "Step Completed is 5" (不带双引号)。这应该适用于 5、10、15、20 到 45

这是代码,但它似乎不起作用。

 #!/bin/bash

while IFS= read -r line; do
        if [[ $line=="5" ]] ; then
           echo "Step Completed is:" $var
        fi
done < "$1"

另外,我想对每 5 个整数值回显相同的语句,即一旦脚本读取 5,它应该回显 - 步骤已完成是 5。一旦它读取 10,它应该回显 - 步骤已完成是 10。就像这样。

要运行脚本,我使用以下命令:

. ./al.sh a.txt

答案1

我建议不要在 shell 脚本中执行此操作,而是使用awk

awk '$1 % 5 == 0 { last_step = $1 } END { printf("Step %s completed\n", last_step ) }' <a.txt

这使得代码简短、快速且简单。该awk代码存储在输入中找到的每个 5 的倍数,并在最后打印找到的最新此类数字。

测试(在具有大括号扩展的 shell 中):

$ printf '%s\n' {1..47} | awk '$1 % 5 == 0 { last_step = $1 } END { printf("Step %s completed\n", last_step ) }'
Step 45 completed

等效的 shell 循环看起来像

while read number; do
    if [ "$(( number % 5 ))" -eq 0 ]; then
        last_step=$number
    fi
done <a.txt

printf 'Step %s completed\n' "$last_step"

您可能需要插入一个测试以确保last_step在执行任何输出之前具有有效值,否则如果您的输入不包含五的倍数,您将得到虚假输出。

答案2

如果您想输出 5 行的“步骤已完成”,则将剩余的步骤号除以 5 并与 0 进行比较:

#!/bin/bash

while IFS= read -r line; 
do
        if [[ $(( line %5 )) -eq  0 ]] ; then
        echo "Step Completed is: $line"
        fi
done < "$1"

(也不是在你的脚本中你的变量被调用linevar......)

如果您只想要最后一行,那么您必须等到最后才能打印它。如果你有一个完整的数字序列,那么你可以在最后计算它:

#!/bin/bash

while IFS= read -r line; 
do
    # do whatever for the line
    echo $line >/dev/null
done < "$1"
echo "Step completed is: $(( 5 * ( line % 5 ) ))"

否则,请记住您最后看到的内容:

#!/bin/bash

while IFS= read -r line; 
do
    [[ $(( line %5 )) -eq  0 ]] && line5=$line 
    # do whatever for the line
done < "$1"
[[ ! -z "$line5" ]]  && echo "Step completed is: $line5"

相关内容