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