如何使用 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
打印行
我尝试使用 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 会将每个逗号分隔的表达式解释为一个新变量。然后,您可以在读取文件
在 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
打印行