如何在bash中将csv文件的列读入数组

6
我有一个csv文件,长这样:
NameColumn1;NameColumn2;NameColumn3;NameColumn4
Row1;Row1;Row1;Row1;
Row2;Row2;Row2;Row2;
Row3;Row3;Row3;Row3;

我想从NameColumn1中获取Row1、Row2和Row3的值,并将它们放入数组中,对于NameColumn2、NameColumn3和NameColumn4也是同样的操作。我不知道会有多少行,但我知道列数。你能提供帮助吗?
谢谢。

请查看以下链接:http://stackoverflow.com/questions/3017128/how-do-you-read-a-csv-file-into-a-two-dimensional-array-in-bash?rq=1 - Technophobe01
我是初学者,所以不太懂……请帮忙。 - Golden
3个回答

8

使用内置命令read的选项/标志-a

#!/usr/bin/env bash

while IFS=';' read -ra array; do
  ar1+=("${array[0]}")
  ar2+=("${array[1]}")
  ar3+=("${array[2]}")
  ar4+=("${array[3]}")
done < file.csv                                                       

printf '%s\n' "${ar1[@]}" "${ar2[@]}" "${ar3[@]}" "${ar4[@]}"
  • 只需要记住数组的索引是从零开始计数的。
  • 这种解决方案的唯一优点是您不需要变量来分配每个字段。

5
假设您有四列:
 while read a b c d; do 
   ar1+=($a)
   ar2+=($b)
   ar3+=($c)
   ar4+=($d)
done < <(sed 's/;/\t/g' somefile.txt)

接下来,您将拥有4个名为ar1到ar4的数组,其中包含它们的列值。


@DavidC.Rankin,我认为这不起作用,-d 会使 read 在遇到分隔符时停止。我想应该是 IFS=';' - Benjamin W.
@BenjaminW。没有-d,它有4个变量,分别命名为a、b、c和d。它是有效的,我在发布之前已经在一个文件上运行了它。 - SaintHax
@SaintHax 当然可以 - 我评论了David的评论,但现在已经消失了 - 它包含了一个使用read -d的替代方案,但是它不起作用,我指出了这一点。 - Benjamin W.
@DavidC.Rankin,我完全支持纯Bash解决方案 ;) - Benjamin W.

1
使用@SaintHax的答案并进行了微调;这对我的应用程序和类似格式的数据起作用。请注意,存储变量上添加了引号,并删除了重定向文件上的sed命令。感谢@Jetchisel的评论,已删除IFS设置。
while read -r a b c d; do 
    ar1+=("$a")
    ar2+=("$b") 
    ar3+=("$c") 
    ar4+=("$d") 
done < somefile.csv 

4
while IFS=';' read .... 这个语句中的 OLDIFS 技巧是不必要的,因为 IFS=';' 在循环结束后就会消失/丢弃。 - Jetchisel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接