如何在LinuxBash中提取csv文件第n列的条件?

如何在LinuxBash中提取csv文件第n列的条件?,linux,bash,csv,if-statement,conditional-statements,Linux,Bash,Csv,If Statement,Conditional Statements,我有一个很大的zip csv.gz文件,其中三列由“|”分隔,如下所示: "s"|"1"|"fgg" "h"|"6"|"kjh" "kjxcz"|"10"|"kj" 我想提取第二列的值大于5的行 我已经知道如何提取第二列本身,但不知道如何放置条件并提取整行 有人能帮忙吗?使用一个简单的列读取循环来收集您需要的信息 while IFS=, read col1 col2 col3 ; do if [ "$col2" > 5 ] ; then echo "$col1|$

我有一个很大的zip csv.gz文件,其中三列由“|”分隔,如下所示:

"s"|"1"|"fgg"
"h"|"6"|"kjh"
"kjxcz"|"10"|"kj"
我想提取第二列的值大于5的行

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


有人能帮忙吗?

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

while IFS=, read col1 col2 col3 ; do
    if [ "$col2" > 5 ] ; then
        echo "$col1|$col2|$col3"
    fi
done < my_file.csv
当IFS=时,读取col1 col2 col3;做
如果[“$col2”>5];然后
回显“$col1 |$col2 |$col3”
fi
完成

这应该是您想要做的,尽管如果您希望提高效率,使用内置函数可能更明智。通常每个场合都有一个。

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='[^"|]+'

你有一个包含多个csv文件的zip存档,还是一个csv文件被Gzip压缩?我想你的意思是
,而不是
=
,因为OP想要提取第二列的值大于5的行。@serenesat Woops,是的,我的错。谢谢你的解决方案。第一种方法效果很好,但gawk的解决方案也给出了5以下的数字,我猜是因为这个数字有点刺痛,在第二种方法中没有考虑到这一点。第二种方法特别是为了避免这种情况——优雅地。你能显示导致第二个解决方案失败的输入数据吗?我只得到小于或等于fiveI的数据,意思是你能显示导致错误的输入数据。如果你用你在问题中发布的输入数据来尝试我的命令,它的行为就不是这样的。如果使用得当且简单,Awk是很酷的。最酷的功能是使用布尔而不是if-then,比如:
cat The.csv | awk-F'[,“]'($2~/[0-9]+/&$3~/F[0-9]+/)|(!$2&!$3)