如何使用 Bash 将 .csv 文件的每一列存储到变量中

How to store each column of a .csv file into a variable with Bash

我尝试使用 Bash 将 .csv 文件的内容存储到变量中。每次昏迷我都想创建一个新变量。

.csv 文件如下所示:

2015-03-17,足球,15:00:00,15:30:00
2015-03-18,篮球,21:00:00,22:00:00

我想将日期存储在一个变量中,将描述(足球...)存储在另一个变量中,将小时数存储在一个不同的变量中。最后我会有 4 个变量。

我已经试过了:

for line in $(< filename)
do
    var1=$(cut -d , -f 1 filename)
    var2=$(cut -d , -f 2 filename)
    var3=$(cut -d , -f 3 filename)
    var4=$(cut -d , -f 4 filename)
done

echo "$var1"

但是输出看起来像这样:

2015-03-17
2015-03-18
Soccer
Basketball
15:00:00
21:00:00
15:30:00
22:00:00

但我想要这样的东西:

2015-03-17
Soccer
15:00:00
15:30:00
2015-03-18
Basketball
21:00:00
22:00:00

这样我就可以将每一列的输出保存在一个变量中。

我也试过 awk

for line in 2
do
    awk -F "," '{print }' filename
    awk -F "," '{print }' filename
    awk -F "," '{print }' filename
    awk -F "," '{print }' filename
done

但我无法只显示第一行,然后显示下一行等等,并将所有内容存储在不同的变量中。

感谢您的帮助。

您可以按照以下方式进行:

while IFS=, read -r date activity starttime endtime
do
  echo $activity
done < filename

如果您将 内部字段分隔符 变量 IFS 设置为逗号,bash 会将每个逗号分隔的表达式解释为一个新变量。然后,您可以在读取文件

的同时在 while 循环中填充这些变量

在 awk 中,当然默认获取变量。你可以随心所欲地处理它们,然后如果你想每行打印一个,只需将 OFS 设置为换行符:

$ awk -F, -v OFS="\n" '{ print , , ,  }' data.txt
2015-03-17
Soccer
15:00:00
15:30:00
2015-03-18
Basketball
21:00:00
22:00:00

如果您真正想要做的只是将逗号转换为换行符,您可以使用这个更惯用的 awk(或者甚至只是 tr ',' "\n" < data.txt

$ awk -F, -v OFS="\n" '{=}1' data.txt
2015-03-17
Soccer
15:00:00
15:30:00
2015-03-18
Basketball
21:00:00
22:00:00

-F, 设置输入域分隔符为逗号

-v OFS="\n" 设置输出字段分隔符为换行符

{=} 重新构造行以使用输出字段分隔符

1 打印行