ディレクトリからいくつかのファイル名を読み取り、抽出して配列に追加しようとしています。そのディレクトリに重複したファイルがあるため、いくつかの重複したファイル名も抽出します。ディレクトリのソースファイル名は次のとおりです。
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