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

时间:2015-03-17 11:02:47

标签: bash variables csv awk output

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

.csv文件如下所示:

2015年3月17日,足球,15:00:00,15:30:00
2015年3月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 $1}' filename
    awk -F "," '{print $2}' filename
    awk -F "," '{print $3}' filename
    awk -F "," '{print $4}' filename
done

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

您可以按照以下方式执行此操作:

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

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

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

答案 1 :(得分:0)

在awk中,当然你默认获得变量。你可以用它们做你想做的事情,然后如果你想每行打印一个,只需将OFS设置为换行符:

$ awk -F, -v OFS="\n" '{ print $1, $2, $3, $4 }' 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=$1}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=$1}重构线以使用输出字段分隔符

1打印