У меня есть текст, содержащий координаты точек, таких как x , y и z , я хотел бы изменить каждую строку так:

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

То, что я хочу: например, для строки 212 которая:

-0.534 2.345 0

Я хочу:

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

Я попробовал этот способ (кажется мне глупым) и до сих пор не завершено:

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

Вот что я получил: например, для строки 212 результат здесь:

Ponit{     212   -0.534, 2.345, 0}

2 ответа2

1

Очень просто с awk:

awk '{printf "Point{%d} = {%s, %s, %s};\n", NR+1000,$1,$2,$3}' file
  • printf отформатируйте вывод по желанию.
  • NR+1000 - номер строки внутри файла +1000.
  • $1,$2,$3 - это поля с 1 по 3.
0

Вы действительно правы в том, что создание такого количества файлов не является необходимым, sed может быть запущен в цепочке, нет необходимости сохранять каждый шаг.

Ниже приведено однострочное решение:

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

Замените in.txt на ваш текущий текстовый файл, результатом будет out.txt.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .