2017-04-12 92 views
0

使用awk,如何在不手动指定每列的情况下输出包含所有非空字段的文件的行?使用awk查找“完整案例”

foo.dat

A||B|X 
A|A|1| 
|1|2|W 
A|A|A|B 

应返回:

A|A|A|B 

在这种情况下,我们可以这样做:

awk -F"|" -v OFS="|" '$1 != "" && $2 != "" && $3 != "" && $4 != "" { print }' foo.dat 

但是,有没有办法做到这一点不指定每列?

回答

2

您可以遍历所有领域,并跳过记录,如果任何字段为空:

$ awk -F'|' '{ for (i=1; i<=NF; ++i) { if (!$i) next } }1' foo.dat 
A|A|A|B 

if (!$i)是:“如果现场i不是非空”,并1是短期的“打印行“,但只有在当前行的任何字段未执行next时才会被触发。

0

另在AWK:

$ awk -F\| 'gsub(/[^|]+(\||$)/,"&")==NF' file 
A|A|A|B 

print如果记录有NF|终止(非空,| -excluding)字符串。

0
awk '!/\|\|/&&!/\|$/&&!/^\|/' file 

A|A|A|B