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" ]]

假设您的输入文件仅包含金、银和铜列中的整数值,您可以使用以下代码:

#!/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"

相关内容