BASHの複数の列でフィルタリング

BASHの複数の列でフィルタリング

grepやawkを使わずにcsvファイルをフィルタリングしたいです。ある変数にはカウンタが必要で、もう一方の変数には3つの列の合計が必要です。

このようなスクリプトを開発しましたが、うまくいきません。 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"

おすすめ記事