配列にスペースを含む文字列を要素として追加します。

配列にスペースを含む文字列を要素として追加します。

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

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
)

readarraystdin 行を配列に吸い込みます。

以下を使用して配列を確認できます。declare -p var

おすすめ記事