使用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
但是,有没有办法做到这一点不指定每列?
使用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
但是,有没有办法做到这一点不指定每列?
您可以遍历所有领域,并跳过记录,如果任何字段为空:
$ awk -F'|' '{ for (i=1; i<=NF; ++i) { if (!$i) next } }1' foo.dat
A|A|A|B
if (!$i)
是:“如果现场i
不是非空”,并1
是短期的“打印行“,但只有在当前行的任何字段未执行next
时才会被触发。
另在AWK:
$ awk -F\| 'gsub(/[^|]+(\||$)/,"&")==NF' file
A|A|A|B
print
如果记录有NF
倍|
终止(非空,|
-excluding)字符串。
awk '!/\|\|/&&!/\|$/&&!/^\|/' file
A|A|A|B