查找"完整案例"用awk

时间:2017-04-12 20:20:06

标签: 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

但有没有办法在不指定每一列的情况下执行此操作?

3 个答案:

答案 0 :(得分:2)

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

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

if (!$i)是“如果字段i不是非空的”,而1是“打印行”的缩写,但仅在next时才会出现没有为当前行的任何字段执行。

答案 1 :(得分:0)

awk中的另一个人:

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

print会记录NF|次终止(非空,| - 排除)字符串。

答案 2 :(得分:0)

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

A|A|A|B