如何在Linux bash中用条件提取csv文件的第n列?

我有一个大的zip csv.gz文件,由三列分隔'|' 喜欢这个:

"s"|"1"|"fgg" "h"|"6"|"kjh" "kjxcz"|"10"|"kj" 

我想提取第二列的值大于5的行。

我已经知道如何提取第二列本身,但不知道如何把条件,但提取整个行。

任何人都可以帮忙吗?

zcat的帮助下, awk可以做到这一点:

 zcat file.gz | awk -F'[|"]' '$5>5' 

输出:

 "h"|"6"|"kjh" "kjxcz"|"10"|"kj" 

我正在使用| 或者"作为字段分隔符,这样就可以很容易地在没有引号的情况下访问字段2的数值,然后检查该值是否大于5.如果条件为真,则awk打印当前行。

你可以使用gawk解决它更优雅。 gawk支持FPAT变量( 字段模式 ),它允许你定义一个字段的样子,而不是被限制来指定分隔符。 在我们的案例中,一个字段是一系列非""字符,它给了我们:

 zcat a.csv.gz | gawk '$2>5' FPAT='[^"|]+' 

使用简单的列读取循环来收集您所需要的信息。

 while IFS=, read col1 col2 col3 ; do if [ "$col2" > 5 ] ; then echo "$col1|$col2|$col3" fi done < my_file.csv 

这应该做你想做的事,但如果你正在寻找效率,使用内置函数可能会更聪明。 通常每个场合都有一个。