【问题标题】:Bash - Loop a command while iterating variables?Bash - 在迭代变量时循环命令?
【发布时间】:2021-10-22 07:30:52
【问题描述】:

我是 BASH 新手,有点迷茫。我也不确定我的特定问题之前是否已经解决(如果有,请道歉)。

我有一个包含 3 列的表的 csv 文件。我想运行一个循环来重复某个命令,并在完成后重新运行我的命令并从我的变量从中提取的表中插入下一个值。我希望重复此过程,直到从表的每一列中提取每个值(我的命令一次提取三个)。

这是我目前所拥有的:

file=$(cat /path/my_ids.csv | awk -v FS=',' '{ print $1}'| head -1 | tail -n 1 )
id1=$(cat /path/my_ids.csv | awk -v FS=',' '{ print $2}'| head -1 | tail -n 2 )
id2=$(cat /path/my_ids.csv | awk -v FS=',' '{ print $3}'| head -1 | tail -n 3 )

这些是我用来从我的表 (my_ids.csv) 中它们各自的列中调用值的变量。我的命令每次通过循环时都需要一次从三个不同的列中提取三个值。一旦循环准备好,我的命令应该看起来像这样 - 我对原始命令所做的只是包括星号之间的内容:

command -base **$file** -tp **$id1** -tp **$id2** -all

(该命令从一个特定程序运行,该程序将创建一个新目录(文件),同时平均其他两个 id 目录。这就是为什么我需要一个循环,每次循环时都会遍历每个变量列中的下一个值.)

如何让 bash 重复该命令并在每次循环出现时向下移动三列值?

感谢您的帮助和耐心!

【问题讨论】:

  • tail -n 3 soo id2 最后有 3 行?
  • 请注意,cat | awk 通常是错误的。而awk | head | tail 也是一种反模式。您根本不应该使用 awk 来解析该行,但如果您想这样做,您可以使用类似 file=$(awk 'NR==n{print $1}' n=$N FS=, /path/my_ids.csv) 而不是(ab-)使用 cat/head/tail 从第 N 行获取值.

标签: bash loops variables awk


【解决方案1】:

逐行逐字段读取文件并执行命令。

{ 
   # ignore first line
   IFS= read -r _
   # read each line and split on ,
   while IFS=, read -r file id1 id2; do
     # execute the command
     command -base "$file" -tp "$id1" -tp "$id2" -all
   done
} < my_ids.csv

阅读https://mywiki.wooledge.org/BashFAQ/001。使用 https://shellcheck.net 检查您的脚本。

【讨论】:

  • 这绝对是正确的做法。一个潜在的警告是您需要确保command 不会尝试从标准输入读取,因为如果这样做,它将消耗用于while read 的数据。使用command &lt;&amp;- -base ... 来防止这种情况可能更安全,或者为read 使用不同的文件描述符。
  • 谢谢!这成功了!在过去的几天里,我遇到了一些麻烦——事实证明,Notepad++ 需要设置为 UNIX。太好了,非常感谢!
猜你喜欢
  • 2023-01-30
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
相关资源
最近更新 更多