我有一个大的zip csv.gz文件,其中三列用'|'分隔像这样:
"s"|"1"|"fgg"
"h"|"6"|"kjh"
"kjxcz"|"10"|"kj"
我想提取第二列的值大于5的行。
我已经知道如何提取第二列本身但不知道如何设置条件并提取整行。
有人可以帮忙吗?
答案 0 :(得分:3)
在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='[^"|]+'
答案 1 :(得分:0)
使用简单的列读取循环来收集所需的信息。
while IFS=, read col1 col2 col3 ; do
if [ "$col2" > 5 ] ; then
echo "$col1|$col2|$col3"
fi
done < my_file.csv
这应该做你想做的事情,尽管如果你正在寻找效率,使用内置函数可能会更聪明。每个场合通常都有一个。