我在 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