逗号分隔文件中的每一行都有 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
在awk
、0
和中""
,是布尔上下文中的两个假值。因此,如果您执行类似操作$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
) 中,然后检查所需字段的条件。