파일 이름 목록을 가져 와서 동일한 첫 번째 열의 두 번째 및 세 번째 열을 추가하면서 csv 파일과 비교

Aug 15 2020

다음과 같은 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

아니면 파일 이름을 배열에 저장할 필요가없는 더 간단한 방법이 있습니까?

답변

Quasímodo Aug 15 2020 at 20:13

나는 제안한다

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을 초과하면 메시지가 포함됩니다.