获取文件名列表,并与 csv 文件进行比较,同时添加同一第一列的第二列和第三列

获取文件名列表,并与 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 记录搜索该名称,为所有行添加该名称的所有第二列和第三列,并且还显示用户值是否超过 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等于f,则将第二个字段和第三个字段的和添加到s。如果总和超过 400,则包含该消息。

相关内容