BASH의 여러 열로 필터링

BASH의 여러 열로 필터링

grep이나 awk를 사용하지 않고 csv 파일을 필터링하고 싶습니다. 한 변수에는 카운터가 필요하고 다른 변수에는 세 열의 합계가 필요합니다.

이와 같은 스크립트를 개발했지만 작동하지 않습니다. if 조건을 사용하여 필터링할 수 없는 것 같습니다. grep 및 awk를 사용하지 않고 열을 필터링하는 다른 방법이 있습니까?

#!/bin/bash

file=athletes.csv
((c=0))
((sum=0))
for line in $(cat ${file})
do
read  id name nat sex date heigh weight sport gold silver bronze <<<${line}
if (( nat == "$1" )) && (( sport == "$2" ))
then
((c++)) #Participants
((sum+=gold+silver+bronze)) #Medals
fi
done
echo "Count:$c, Sum:$sum"

답변1

너 먼저이와 같은 파일은 읽어서는 안 됩니다.while read, 다음과 같은 루프를 사용할 수 있습니다 .

while IFS=, read -r id name nat sex date heigh weight sport gold silver bronze; do
  ...
done < "$file"

(( nat == "$1" ))다음으로 당신은 예를 들어 당신 이 원하는 것이 아니라 작동하지 않을 것이라고 가정하는 문자열을 비교하기 위해 산술 확장을 사용하고 있습니다.[[ $nat == "$1" ]]

입력 파일에 Gold, Silver 및 Bronze 열의 정수 값만 포함되어 있다고 가정하면 다음 코드를 사용할 수 있습니다.

#!/usr/bin/env bash

file=input.csv
c=0
sum=0

while IFS=, read -r id name nat sex date heigh weight sport gold silver bronze; do
    if [[ $nat == "$1" && $sport == "$2" ]]; then
        ((c++))
        ((sum+=gold+silver+bronze))
    fi
done < "$file"

printf 'Count: %d, Sum: %d\n' "$c" "$sum"

관련 정보