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

时间:2015-08-18 08:30:27

标签: linux bash csv if-statement conditional-statements

我有一个大的zip csv.gz文件,其中三列用'|'分隔像这样:

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

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

我已经知道如何提取第二列本身但不知道如何设置条件并提取整行。

有人可以帮忙吗?

2 个答案:

答案 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

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