ファイル名のリストを取得し、同じ1列目の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
または、ファイル名を配列に保存する必要がない、より簡単な方法はありますか?
回答
Quasímodo
私は提案します
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
がに等しい場合、f
2番目と3番目のフィールドの合計がに追加されs
ます。合計が400を超える場合、メッセージが含まれます。