shell - inserção de múltiplos textos em cada linha de um arquivo

0

Eu tenho um texto contendo coordenadas de pontos, como x , y e z , gostaria de alterar cada linha como:

Point{ (1000+linenumber) } = {x , y, z};

O que eu quero é: por exemplo, para a linha 212 , que é:

-0.534 2.345 0

Eu quero:

Point{1212} = {-0.534, 2.345, 0};

Eu tentei desse jeito (parece estúpido para mim) e ainda NÃO é completo:

while read p; do
  echo "$p"  | sed 's/\s/,/g;s/,$//' >> ./allPoint2
done <allPoint

rm -rf ./allPoint;
mv ./allPoint2 ./allPoint

cat -n allPoint > allPoint2
sed 's/^/Ponit{ /' ./allPoint2 >> allPoint3

rm -rf ./allPoint ./allPoint2;
mv ./allPoint3 ./allPoint

sed 's/$/}/' ./allPoint >> allPoint2

rm -rf ./allPoint;
mv ./allPoint2 ./allPoint

Isso é o que recebi: por exemplo, para a linha 212 , o resultado aqui é:

Ponit{     212   -0.534, 2.345, 0}
    
por user2090491 06.10.2015 / 11:58

2 respostas

1

Muito simples com awk :

awk '{printf "Point{%d} = {%s, %s, %s};\n", NR+1000,$1,$2,$3}' file
  • printf formata a saída como desejado.
  • NR+1000 é o número da linha dentro do arquivo +1000.
  • $1,$2,$3 são os campos 1 a 3.
por 06.10.2015 / 12:48
0

Você está certo de que criar tantos arquivos é desnecessário, sed pode ser executado em uma cadeia, não há necessidade de salvar cada etapa.

O seguinte é uma solução de linha única:

linenumber=0 && while read line; do linenumber=$((linenumber+1)) && echo $line | sed "s#^#Point{$linenumber} = {#g" | sed 's#$#};#g' >> out.txt; done<in.txt

Substitua in.txt pelo seu arquivo de texto atual, out.txt será o resultado.

    
por 06.10.2015 / 12:48

Tags