将带有空格的字符串作为元素添加到数组

将带有空格的字符串作为元素添加到数组

我正在从目录中读取并提取一些文件名,并尝试将它们添加到数组中。给定的目录有重复的文件,所以我也会提取一些重复的文件名。目录中原始文件名如下:

100_abc strategy-42005_04May2020_0000-04May2020_first_file.csv   
100_abc strategy-42005_04May2020_0000-04May2020_second_file.csv   
101_xyz statitics strategy_04May2020_first_file.csv

使用的脚本:


#!/bin/bash

c=0

for filename in /home/vikrant_singh_rana/testing/*; do
        #stripping a file name 
        GroupName=$(basename "$filename" ".csv" | awk -F "_" '{print $2}' | awk -F "-" '{print $1}')
        echo "$GroupName"

        var=["$c"]="$GroupName"
        c=$(($c+1))
done
echo "print my array"
echo "${var[*]}"

它从目录中提取的文件名包含空格。例如。

abc strategy
abc strategy
xyz statistics strategy

所以当我打印我的数组时,它会像这样打印

abc strategy abc strategy xyz statistics strategy

如果在读取时再次遇到相同的文件,上面的代码将再次将相同的文件名添加到数组中。

所以我添加了一个 if 语句以防止出现这种情况,该语句无法按预期工作。我期望数组应该具有唯一的文件名作为元素。

for filename in /home/vikrant_singh_rana/testing/*; do
        GroupName=$(basename "$filename" ".csv" | awk -F "_" '{print $2}' | awk -F "-" '{print $1}')

        if [[  "${var[@]}"  =~ "$GroupName" ]]; then
                echo "I am here "
                c=$(($c+1))
                var["$c"]="$GroupName"
        fi

done

答案1

sort在管道中可能更容易:

readarray -t var < <(
    cd "$HOME/testing"
    printf "%s\n" * | cut -d"_" -f2 | cut -d"-" -f1 | sort -u
)

readarray会将 stdin 行吸进数组中。

您可以使用以下命令检查数组declare -p var

相关内容