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