根据条件提取线

根据条件提取线

逗号分隔文件中的每一行都有 5 个字段。

a,b,c,d,e
f,g,c,i,
j,k,c,m,n
o,p,c,r,s
t,u,c,w,
x,y,z,aa,bb

如何提取第三个字段中有 c 并且第五个字段不为空的行?结果将是:

a,b,c,d,e
j,k,c,m,n
o,p,c,r,s

答案1

可能的解决方案awk

awk -F',' '$3 == "c" && $5' file

根据实际数据,这可能无法按照评论中提到的那样工作(感谢 Janis 指出这一点:它将错过f,g,c,i,0例如第 5 个字段为 0),因此您可以执行以下操作:

awk -F',' '$3 == "c" && $5 != ""' file

由于这是公认的答案,我添加不太明显的强制第五个字段到字符串(如 cuonglm(+1) 解决方案中所示):

awk -F',' '$3 == "c" && $5""' file

答案2

sed -n '/,$/!s/^\([^,]*,\)\{2\}c/&/p'

...适用于 POSIX sed。如果您可以使用sed实现 AT&T 的增强型正则表达式 - 例如在停止打开包 - 你可以这样做:

sed -nX '/^(([^,]*,){2}c.*)&(.*,)!$/p'

当然,如果后一种情况属实,你可能也会有类似的情况grep (顺便说一句,可以编译为ksh93内置程序)所以你可能应该这样做:

grep -xX '(([^,]*,){2}c.*)&(.*,)!'

答案3

awk

awk -F, '$3 == "c" && $5""' file

awk0和中"",是布尔上下文中的两个假值。因此,如果您执行类似操作$3 == "c" && $5,您将错过第五个字段所在的行0$5""强制将awk第五个字段强制转换为字符串,字符串"0"将被评估为 true。

答案4

使用python

#!/usr/bin/env python2
with open('file.txt') as f:
    for line in f:
        fields = line.rstrip().split(',')
        if fields[2] == 'c' and fields[4]:
            print line.rstrip()

在这里,我们将用逗号 ( ) 分割的每一行的字段,放入列表 ( fields) 中,然后检查所需字段的条件。

相关内容