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

时间:2016-05-11 21:41:45

标签: bash csv

我有一个看起来像这样的csv文件

NameColumn1;NameColumn2;NameColumn3;NameColumn4
Row1;Row1;Row1;Row1;
Row2;Row2;Row2;Row2;
Row3;Row3;Row3;Row3;

我想从NameColumn1获取Row1,Row2和Row3中的值并将它们放入数组中,对于NameColumn2,NameColumn3和NameColumn4也是如此。

我不知道我会有多少行,但我知道列的数量。 有什么帮助吗?

谢谢。

3 个答案:

答案 0 :(得分:2)

假设你有四列

 while read a b c d; do 
   ar1+=($a)
   ar2+=($b)
   ar3+=($c)
   ar4+=($d)
done < <(sed 's/;/\t/g' somefile.txt)

然后你有4x数组,名为ar1到ar4,其中包含列值。

答案 1 :(得分:0)

使用SaintHax答案并进行调整;这适用于我的应用程序和类似格式的数据。请注意,在存储的var上添加了引号,并在重定向的文件上删除了sed命令。

OLDIFS=$IFS # save original IFS setting
IFS=';' 
while read -r a b c d; do 
    ar1+=("$a")
    ar2+=("$b") 
    ar3+=("$c") 
    ar4+=("$d") 
done < somefile.txt 
IFS=$OLDIFS # restore orig setting

答案 2 :(得分:0)

使用内置-a中的read选项/标志。

#!/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[@]}"
  • 只需要记住数组的索引从零开始计数即可。
  • 此解决方案的唯一优点是,您不需要为每个字段分配变量。