我有一个 csv 文件,看起来像这样:
first_name,surname,email,
first_name2,surname2,email2,
....3,..
....4,...
Run Code Online (Sandbox Code Playgroud)
每列的行数相同。
我想运行一个命令来迭代每一列并从每一列中获取值并将其替换到命令中。
例如,
for each_row;
do [command foo{first_name} .... bar{surname}.... sth_else{email}];
done
Run Code Online (Sandbox Code Playgroud)
我正在考虑做类似的事情
for i in `awk -F, '{print $1}' my_file.csv`; do
some command with i`;
done
Run Code Online (Sandbox Code Playgroud)
但是,这仅允许我使用字段 1 中的值运行命令。我如何运行命令,以便它允许我在每次迭代时从每一列获取值?
假设您的 CSV 是“简单 CSV”格式,其中没有字段嵌入逗号或换行符(通用 CSV 文件中允许使用逗号或换行符,并正确引用字段),您可以直接使用以下命令读取字段read
:
while IFS=, read -r name familyname address; do
printf 'Got "%s", "%s", and "%s"\n' "$name" "$familyname" "$address"
done <file.csv
Run Code Online (Sandbox Code Playgroud)
该read
实用程序会将每一行拆分为 中的值的字段$IFS
,并且我们确保在调用 时该变量包含逗号read
。name
前两个逗号分隔字段将以变量和结尾familyname
,而该行的其余部分将以变量 结尾address
。如果每行以不需要的逗号结尾(如问题中所示),则在每行读取一个虚拟变量(在dummy
后面添加address
作为单独的变量),或调整循环内的withread
值以截掉尾随逗号。address
address=${address%,}
我们使用-r
withread
来正确读取数据中的任何反斜杠。
如果 CSV 文件有需要跳过的标题行,
sed 1d file.csv |
while IFS=, read -r name familyname address; do
printf 'Got "%s", "%s", and "%s"\n' "$name" "$familyname" "$address"
done
Run Code Online (Sandbox Code Playgroud)
您可以使用 代替命令sed
(删除第一行输入并传递所有其他行),tail -n +2
它可以执行相同的操作。