同じ最初の列の2番目と3番目の列を追加しながら、ファイル名のリストを取得し、csvファイルと比較します。

同じ最初の列の2番目と3番目の列を追加しながら、ファイル名のリストを取得し、csvファイルと比較します。

次のCSVファイルがあります。

user1,400,300
user2,250,250
user3,400,300
user1,400,300
user4,400,300
user2,250,250

ユーザー名を付けた空のファイルを含むディレクトリ

$ ls /dir/*
/dir/user1
/dir/user2

ファイルを見つけてその名前を配列に保存し、csvレコードを介してその名前を取得し、すべての行にその名前の2番目と3番目の列をすべて追加し、ユーザーの値がex:400を超えるかどうかを表示したいと思います。

結果の例:

user1,1400
user1 has exceed 400
user2,1000
user2 has exceed 400

助けてくれて本当にありがとうございます。現在、私は結果なしでこれをやろうとしています。

shopt -s nullglob
cd /dir/
ARRAY=(*)

for ((i=0; i<${#ARRAY[@]}; i++)); do
    name=${ARRAY[i]}
    awk '
    BEGIN{FS=OFS=","} {$name += (($2+$3))} 
    END{for (j in a) printf "%s | %0.2f\n", j, a[j]}
    ' /dir.csv
done
cd

それとも、ファイル名を配列に保存する必要のない簡単な方法がありますか?

答え1

私はお勧めします

for f in dir/*; do awk -F ',' '$1==f{s+=$2+$3}END{print f","s;if(s>400)print f" has exceeded 400"}' f="$(basename "$f")" dir.csv; done

または拡張された同等の項目から:

for f in dir/*; do 
    awk -F ',' '
        $1==f{s+=$2+$3}
        END{
            print f","s
            if(s>400)print f" has exceeded 400"
        }
    ' f="$(basename "$f")" dir.csv
done

の各ファイルに対して、デフォルトdir/名(つまりパスのない名前)がawkスクリプトに変数として渡されますf

awkスクリプトでは、フィールド区切り文字はコンマに設定されています-F ','。次に、の最初のフィールドがdir.csvと等しい場合は、f2番目と3番目のフィールドの合計をに追加しますs。合計が400を超える場合は、メッセージを含めてください。

関連情報