将 bash 中的分隔文本文件解析为命令参数

Dea*_*ean 10 scripting bash text-processing csv

我有一个像这样拆分的文本文件:

field1,field2,field3 
xield1,xield2,xield3 
dield1,dield2,dield3 
gield1,gield2,gield3
Run Code Online (Sandbox Code Playgroud)

这些列中的每一列都将是程序的参数,我希望为每一行调用该程序

我希望有一个循环,例如:

for $i in file
    command $field2 -x $field3 -PN -$field1 >> output
done
Run Code Online (Sandbox Code Playgroud)

在 bash 中完成这样的事情的最佳方法是什么?

cof*_*Mug 7

while IFS=, read xx yy zz;do
    echo $xx $yy $zz
done < input_file
Run Code Online (Sandbox Code Playgroud)

如果字段数不变,这应该有效。而不是echo使用您的命令。


Jos*_* R. 5

您应该将 awhileread内置函数一起使用:

while IFS= read -r line;do
    fields=($(printf "%s" "$line"|cut -d',' --output-delimiter=' ' -f1-))
    command "${fields[1]}" -x "${fields[2]}" ... # ${fields[1]} is field 2
done < your_file_here
Run Code Online (Sandbox Code Playgroud)

这是如何运作的

  • cut语句获取该行并按照 指定的分隔符将其分割-d
  • 是用于显示所选字段--output-delimiter的分隔符cut,这里我们选择一个空格,以便我们可以将不同的字段放入数组中fields
  • 最后,我们需要所有字段(从字段 1 到字段末尾),这就是-f1-发挥作用的地方。
  • 现在,您已经将不同的字段存储在数组变量中fields,您可以使用语法访问您想要的任何特定字段,${field[number]}其中number比您想要的实际字段编号小 1,因为在 Bash 中数组索引是从零开始的。

笔记

  • 如果您的任何字段包含空格,此操作将会失败。

对于恒定数量的字段

您可以执行类似于1_CR 的答案的操作:

while IFS= read -r line;do
    IFS=, read -r field1 field2 field3 <<-EOI
    $line
    EOI
    command "$field2" -x "$field3" ... 
done < your_file_here
Run Code Online (Sandbox Code Playgroud)

上面的代码虽然看起来比较吵闹,但应该可以在任何兼容 POSIX 的 shell 中工作,而不仅仅是 Bash。