Você estava perto, mas precisava extrair o primeiro valor, porque não quer imprimir isso para cada palavra correspondente. Podemos usar printf
para evitar novas linhas.
awk '{printf "%s",$1
for (i=1;i<=NF;i++)
{
if ($i ~ /dog|cow/) { printf " %s",$i; }
}
print ""
}'
A saída seria:
A dog999 dog284 cow284 cow432
B cow394 cow432 cow345 dog983
C dog847 cow395 dog496
D dog392 cow237 cow749
Isso pode ser reduzido a uma linha:
awk '{printf "%s",$1; for (i=1;i<=NF;i++) { if ($i ~ /dog|cow/) { printf " %s",$i; } } print "" }'
Observe que isso imprimirá uma linha que não corresponde a nenhuma palavra eg
E pig sheep
irá produzir
E