7

我正在学习在 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

4 回答 4

14

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

#!/bin/bash

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

解释:eCollection由于外括号,该变量是一个数组。它使用来自$(cut -d ',' -f2 MyAssignment.csv)子 shell 的 IFS 分隔(想想函数或命令行参数)单词中的每个元素进行初始化,这是cut与分隔符一起使用的命令,并从文件中','打印第二个字段。-f2MyAssignment.csv

printf语句仅显示如何按索引打印任何项目,您也可以尝试echo "${eCollection[@}]}"查看所有元素。

于 2013-09-07T04:56:29.677 回答
11

两个纯 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]}"
于 2013-09-07T13:11:28.100 回答
10

更好的是使用readarray. 无需介意 IFS 可能有任何价值,并且不受路径名扩展的影响。

readarray -t eCollection < <(cut -d, -f2 MyAssignment.csv)
printf '%s\n' "${eCollection[0]}"
于 2013-09-07T09:17:54.963 回答
0

我喜欢用awk。首先根据,分隔符拆分并将所需的列值放入数组中。

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

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

于 2020-05-07T08:29:16.983 回答