我想在文件的每一行中将第四列的元素添加到一个数组中,但是现在我不知道如何将分隔的元素添加到另一个数组中。我的方法似乎有一些问题:
#!/bin/bash
declare -a arr
cat 2.csv | while read line
do
IFS=',' read -ra str <<< "$line"
# echo ${str[3]}
arr+=(${str[3]})
done
for(( i=0;i<${#arr[@]};i++)) do
echo ${arr[i]};
done;
答案 0 :(得分:2)
问题在于,管道中的每个进程都在子Shell中运行。因此,此代码在子外壳程序内修改了arr
。在子shell外部无法生存环境。
cat 2.csv | while read line
do
IFS=',' read -ra str <<< "$line"
# echo ${str[3]}
arr+=(${str[3]})
done
为避免这种情况,请使用重定向:
while read line
do
IFS=',' read -ra str <<< "$line"
# echo ${str[3]}
arr+=(${str[3]})
done <2.csv
答案 1 :(得分:2)
除了John1024's answer外,无需读取行,然后再次读取以将其分割。您可以在第一次进行分割:
while IFS=, read -ra str
do
arr+=("${str[3]}") # Quote here if you don't want further splitting
done < 2.csc
答案 2 :(得分:1)
您可以读入变量并丢弃不需要的变量,而不是读入数组:
while IFS=, read -r _ _ _ str _; do arr+=("$str"); done < 2.csv
这仅在所需索引相对较低的情况下才实用。
使用cut
和流程替换的另一种选择:
readarray -t arr < <(cut -d, -f4 2.csv)