如何将与字符串分隔的元素添加到另一个数组?

时间:2019-04-12 03:58:18

标签: arrays bash

我想在文件的每一行中将第四列的元素添加到一个数组中,但是现在我不知道如何将分隔的元素添加到另一个数组中。我的方法似乎有一些问题:

#!/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;

3 个答案:

答案 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)