我正在学习用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脚本没有将第二列放入数组中,我做错了什么?
答案 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
,以忽略标题。