$ awk 'BEGIN { id["NA"] = ++n } { for (i=2; i<=NF; ++i) { id[$i] || id[$i] = ++n; $i = id[$i] - 1 } } { print } END { for (i in id) { print i, id[i] - 1 >"map" } }' file
img1 1 2 3
img2 1 4 5
img3 6 2 7
img4 0 2 8
Isso atribui uma ID exclusiva a cada valor em todas as colunas, exceto a primeira (a coluna img
). Optei por tornar os IDs globalmente exclusivos, em vez de exclusivos para uma coluna, pois isso reduziria o número de arquivos de mapeamento necessários a serem produzidos.
O script foi desvendado:
BEGIN { id["NA"] = ++n }
{
for (i=2; i<=NF; ++i) {
id[$i] || id[$i] = ++n;
$i = id[$i] - 1
}
}
{ print }
END {
for (i in id) {
print i, id[i] - 1 >"map"
}
}
Começa atribuindo a string NA
o ID 1 (os IDs são sempre decrementados por 1 antes da saída) e também atualiza o contador n
para 1. n
será sempre o ID atribuído ao anterior string.
Para cada linha de entrada, nós iteramos pelos campos. Se nenhum ID foi atribuído à string no campo atual, nós atribuímos um e modificamos o campo no lugar.
A linha é impressa com seus campos modificados.
No final, todas as strings e seus IDs correspondentes são armazenados no arquivo chamado map
.
Para a entrada dada, este arquivo pode ser parecido com
bb 2
ee 7
cc 3
NA 0
tt 8
dd 5
yy 4
aa 1
uu 6