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.txtcontém apenas as primeiras colunas extraídas efile.txté o arquivo principal -
NR==FNR {a[$0]=NR; next}salva cada registro do arquivoid.txtcomo chave da matriz associativaacom o valor sendo o número da linha correspondente.nextgarante 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 interpretartruepara 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 -f1obtém o número da linha -
cut -d' ' -f2- file.txtobté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