![如何计算 CSV 文件中给定行中的参数数量](https://linux22.com/image/62261/%E5%A6%82%E4%BD%95%E8%AE%A1%E7%AE%97%20CSV%20%E6%96%87%E4%BB%B6%E4%B8%AD%E7%BB%99%E5%AE%9A%E8%A1%8C%E4%B8%AD%E7%9A%84%E5%8F%82%E6%95%B0%E6%95%B0%E9%87%8F.png)
我在 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
这当然不是一个应该用sed
、grep
或类似的任务来解决的任务,而是自然地用 来解决awk
。要过滤文件中至少包含 4 个(逗号分隔)字段的行:
awk -F, 'NF>=4' my_csv_file.csv
要过滤具有例如至少 4 个且最多 6 个(逗号分隔)字段的行:
awk -F, 'NF>=4 && NF<=6' my_csv_file.csv