使用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
但有没有办法在不指定每一列的情况下执行此操作?
答案 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