【问题标题】:BASH - loop (for) with IF thru each line from fileBASH - 通过文件中的每一行使用 IF 循环(for)
【发布时间】:2019-02-28 06:30:01
【问题描述】:

我有如下数据的文件 (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 倍,因为我在文件中有 4 行。那么第一次运行会给我

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

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

【问题讨论】:

  • 使用IFS添加逗号作为分隔符,然后使用read name number读取名称和编号(如果需要,可以添加-rread -r name number) .然后用名字和号码做你需要的事情。
  • 您的awk 命令读取整个文件(同样——基本上忽略了您只是将原始版本的一行读入p)并将所有行的数字加一。当它读取下一行时,它会再次向文件中的每一行添加一个。重复 4 行,因此文件中的每一行都添加了 4 行。它正在做你编程的事情。你想做什么?您的输入数据很无聊,因为所有行开头都包含 1;这真的是它的样子吗?什么时候会有所不同?
  • 嗨乔纳森,文件内的数据将是这样的,因为这是审计文件,其中将存储函数启动次数的信息。并非总是所有行都具有相同的编号,因为代码的其他部分将删除行或添加新行。在这个阶段我只需要在每一行添加下一个数字
  • 我真的不清楚你在做什么。如果您正在审核“已启动的函数”,那么您是否有当前“运行”中调用的函数列表,以及之前的函数列表以及每个函数被调用的次数?如果您只想在每一行中添加一个,则只需运行一次awk 命令即可。所以,大概,你有更多的想法。如果您有一个文件,其中的函数按调用顺序调用,那么sort | uniq -c(需要额外的参数)可以将名称组合在一起并计算行数。
  • 我有 java jmx 函数,这个函数将检查服务是否启动(通过 jmx)如果是,则不会执行任何操作,如果不是脚本将执行重启,但这是我的代码,脚本只会尝试5次重启。因为我需要存储这些信息,所以我有审计文件,并且需要通过审计这个 + 1 功能来完成。我希望这能解释我的想法。

标签: bash loops for-loop if-statement


【解决方案1】:

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

【讨论】:

  • Awk 是否应该在找到达到 5 的记录时立即终止,还是应该继续运行但在结束时发出信号我们已经完成?
  • 谢谢,如何改变它以不终止到不是 5 的其他行?
  • 您接受,然后您提出后续问题,仍然没有在页面顶部澄清您的问题?哦,好吧,我会更新答案。
猜你喜欢
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多