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 中完成这样的事情的最佳方法是什么?
while IFS=, read xx yy zz;do
echo $xx $yy $zz
done < input_file
Run Code Online (Sandbox Code Playgroud)
如果字段数不变,这应该有效。而不是echo
使用您的命令。
您应该将 awhile
与read
内置函数一起使用:
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
。-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。