BASH - 如何从CSV文件中的列中提取数据并将其放入数组中?

时间:2013-09-07 04:38:09

标签: arrays bash csv

我正在学习用Bash编写脚本。

我有一个包含5列和22行的CSV文件。我有兴趣从第二列获取数据并将其放入数组中。

我想要的是名字在array[0],第二名在array[1],依此类推。

Bash脚本:

#!/bin/sh
IFS=","
eCollection=( $(cut -d ',' -f2 MyAssignment.csv ) )
printf "%s\n" "${eCollection[0]}"

CSV看起来像这样。没有带标题的行。

具有Vl18xx数字的列是我想要拆分成数组的。

John,Vl1805,VRFname,10.9.48.64/28,10.9.48.78 
John,Vl1806,VRFname,10.9.48.80/28,10.9.48.94
John,Vl1807,VRFname,10.9.48.96/28,10.9.48.110 
John,Vl1808,VRFname,10.9.48.112/28,10.9.48.126
John,Vl1809,VRFname,167.107.152.32/28,167.107.152.46

bash脚本没有将第二列放入数组中,我做错了什么?

4 个答案:

答案 0 :(得分:10)

删除IFS=","分配,从而允许空格,制表符,换行符的默认IFS值适用

#!/bin/bash

eCollection=( $(cut -d ',' -f2 MyAssignment.csv ) )
printf "%s\n" "${eCollection[0]}"

答案 1 :(得分:8)

两种纯粹的bash解决方案:

eCollection=()
while IFS=',' read -r _ second _; do
    eCollection+=("$second")
done < file.txt
printf '%s\n' "${eCollection[0]}"


readarray -t eCollection < file.txt
eCollection=("${eCollection[@]#*,}")
eCollection=("${eCollection[@]%%,*}")
printf '%s\n' "${eCollection[0]}"

答案 2 :(得分:7)

最好是使用readarray。无需考虑可能具有任何价值的IFS,并且不受路径名扩展的影响。

readarray -t eCollection < <(cut -d, -f2 MyAssignment.csv)
printf '%s\n' "${eCollection[0]}"

答案 3 :(得分:0)

我喜欢使用awk。首先基于,定界符进行分割,并将所需的列值放入数组中。

abc=($(tail -n +1 MyAssignment.csv | awk -F ',' '{print $2;}'))
echo ${abc[1]}

索引从1开始。如果文件包含标题,请将+1替换为+2,以忽略标题。