如何计算 CSV 文件中给定行中的参数数量

如何计算 CSV 文件中给定行中的参数数量

我在 CSV 文件中积累了数据,如下所示:

Parameter_1,Parameter_2,Parameter_3,Parameter_4,Parameter_5,Parameter_6
Parameter_1,Parameter_2,Parameter_3,Parameter_4
Parameter_1,Parameter_2,Parameter_3,Parameter_4
Parameter_1,Parameter_2,Parameter_3,Parameter_4,Parameter_5
Parameter_1,Parameter_2,Parameter_3,Parameter_4
Parameter_1,Parameter_2,Parameter_3
Parameter_1,Parameter_2,Parameter_3,Parameter_4
Parameter_1
Parameter_1,Parameter_2,Parameter_3,Parameter_4

我怎样才能读取有 4 个或更多参数的行,即:

Parameter_1,Parameter_2,Parameter_3,Parameter_4,Parameter_5,Parameter_6
Parameter_1,Parameter_2,Parameter_3,Parameter_4
Parameter_1,Parameter_2,Parameter_3,Parameter_4
Parameter_1,Parameter_2,Parameter_3,Parameter_4,Parameter_5
Parameter_1,Parameter_2,Parameter_3,Parameter_4
  X Parameter_1,Parameter_2,Parameter_3 X DO NOT READ THIS because it has less than 4 parameters
Parameter_1,Parameter_2,Parameter_3,Parameter_4
  X Parameter_1 X DO NOT READ THIS because it has less than 4 parameters
Parameter_1,Parameter_2,Parameter_3,Parameter_4

理想情况下,我想阅读超过 X参数且小于参数 - 即如果给定行中有太多参数,则不读取它

问:这怎么用 BASH 写呢?

?A:[应该]代码如下所示:

number_of_parameters=`"$line" | sed 's/[^,]//g' | wc -c` #where $line is the line thats being currently read
if [ "number_of_parameters" -gt "X" ] && [ "number_of_parameters" -lt "Y" ]
then
     ... do something
fi

答案1

使用 grep 可以获得更简单的解决方案。

grep -E '^(.*,){3}' my_csv_file.csv

由于 4 个或更多参数将至少有 3 个逗号,因此正则表达式中的 3 个。

(.*,)将匹配后跟逗号的参数。.*表示匹配任何 char (.) 0 次或多次。

这是在变量中保存值的另一种方法:

my_var=$(grep -E '^(.*,){3}' my_csv_file.csv)
echo "$my_var"

确保 $my_var 周围有“”,否则你将丢失换行符。

答案2

这当然不是一个应该用sedgrep或类似的任务来解决的任务,而是自然地用 来解决awk。要过滤文件中至少包含 4 个(逗号分隔)字段的行:

awk -F, 'NF>=4' my_csv_file.csv

要过滤具有例如至少 4 个且最多 6 个(逗号分隔)字段的行:

awk -F, 'NF>=4 && NF<=6' my_csv_file.csv

相关内容