Awk
solução:
awk '{
if (NF == 2) {
if ($1 in r) {
a[r[$1]] = a[r[$1]] OFS $2; next
}
a[$1] = $2; r[$2] = $1;
}
else a[$1];
}
END{ for (i in a) print i, a[i] }' file
-
NF == 2
- condição indicando um registro com 2 campos (NF
- número total de campos) -
a
- matriz que contém nomes de arquivos "independentes" (que não foram renomeados) comob
ed
ou relação entre o nome do arquivo inicial e sua versão renomeada (por exemplo,a -> f
) -
r
- matriz que contém a relação oposta "nome do arquivo renomeado" - > "nome do arquivo inicial" (por exemplo,f -> a
)
A saída:
a f z
b
c e
d
No caso, se algum nome de arquivo pudesse ter sido renomeado mais de uma vez - use a seguinte solução estendida:
awk '{
if (NF == 2) {
if ($1 in r) {
a[r[$1]] = a[r[$1]] OFS $2; r[$2] = r[$1];
}
else { a[$1] = $2; r[$2] = $1 }
}
else a[$1];
}
END{ for (i in a) print i, a[i] }' file