Se você quiser incrementar o primeiro campo de maneira monótona, você não precisa usar um arquivo extra para o mapeamento ou o primeiro campo, apenas use awk
para definir o primeiro campo como o número da linha (registro):
awk '{$1=NR} 1' file.txt
Ele reconstruirá todo o registro com espaço como o novo separador de campo, mas, nesse caso, acho que estamos seguros, pois os campos estão separados por espaços.
Agora, aqui estão as maneiras de resolver seu problema em que você tem um arquivo extra, digamos id.txt
com os primeiros campos:
Seria melhor usar algo que pudesse entender o número da linha e acompanhá-lo, por exemplo. awk
:
awk 'NR==FNR {a[$0]=NR; next} {$1=a[$1]} 1' id.txt file.txt
-
assumindo,
id.txt
contém apenas as primeiras colunas extraídas efile.txt
é o arquivo principal -
NR==FNR {a[$0]=NR; next}
salva cada registro do arquivoid.txt
como chave da matriz associativaa
com o valor sendo o número da linha correspondente.next
garante que nenhum processamento adicional seja feito nos registros deid.txt
-
{$1=a[$1]}
define o primeiro campo para o valor do elemento da matriz correspondente; note que, isto tem a ressalva de reconstruir o registro inteiro com espaço como o separador, mas eu acho que neste caso estamos seguros para alavancar essa brevidade.1
é apenas um espaço reservado para interpretartrue
para que todo o registro seja impresso posteriormente
Se você se sentir chique, você pode usar algumas ferramentas * nix padrão, com a ajuda da substituição de processo ( <()
) de bash
e paste
finally:
paste -d' ' <(nl id.txt | cut -f1) <(cut -d' ' -f2- file.txt)
-
nl id.txt | cut -f1
obtém o número da linha -
cut -d' ' -f2- file.txt
obtém todos os campos, exceto o primeiro
Exemplo:
% cat file.txt
565 0 10 12 23 18 17 25
564 1 7 12 13 16 18 40 29 15
182 10 12 23 18 17 25
892 1 7 12 13 16 18 40 29 15
% awk '{$1=NR} 1' file.txt
1 0 10 12 23 18 17 25
2 1 7 12 13 16 18 40 29 15
3 10 12 23 18 17 25
4 1 7 12 13 16 18 40 29 15
% cat id.txt
565
564
182
892
% awk 'NR==FNR {a[$0]=NR; next} {$1=a[$1]} 1' id.txt file.txt
1 0 10 12 23 18 17 25
2 1 7 12 13 16 18 40 29 15
3 10 12 23 18 17 25
4 1 7 12 13 16 18 40 29 15
% paste -d' ' <(nl id.txt | cut -f1) <(cut -d' ' -f2- file.txt)
1 0 10 12 23 18 17 25
2 1 7 12 13 16 18 40 29 15
3 10 12 23 18 17 25
4 1 7 12 13 16 18 40 29 15