gawk -F '\\[[^\\]]*\\]' '
{
    # Divide $2 e $3 em arrays usando espaço como delimitador
    split($2, subst, " ")
    split($3, adjs, " ")

    # Verifica se há mais de uma palavra em $2 e $3
    if (length(subst) > 1 || length(adjs) > 1) {
        # Gera todas as combinações de palavras
        for (i in subst) {
            for (j in adjs) {
                print $1 "|" subst[i] "|" adjs[j]
            }
        }
    } else {
        # Se não há locuções, imprime a linha original
        print $1 "|" $2 "|" $3
    }
}' frases_ecosol_funcoes_morfologicas.txt

