![동일한 첫 번째 열의 두 번째 및 세 번째 열을 추가하면서 파일 이름 목록을 가져오고 csv 파일과 비교합니다.](https://linux55.com/image/178665/%EB%8F%99%EC%9D%BC%ED%95%9C%20%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20%EC%97%B4%EC%9D%98%20%EB%91%90%20%EB%B2%88%EC%A7%B8%20%EB%B0%8F%20%EC%84%B8%20%EB%B2%88%EC%A7%B8%20%EC%97%B4%EC%9D%84%20%EC%B6%94%EA%B0%80%ED%95%98%EB%A9%B4%EC%84%9C%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%20%EB%AA%A9%EB%A1%9D%EC%9D%84%20%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B3%A0%20csv%20%ED%8C%8C%EC%9D%BC%EA%B3%BC%20%EB%B9%84%EA%B5%90%ED%95%A9%EB%8B%88%EB%8B%A4..png)
다음과 같은 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을 초과하는 경우 메시지를 포함하세요.