shell - множественная вставка текста в каждую строку файла
У меня есть текст, содержащий координаты точек, таких как 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 ответа
Решение
Очень просто с awk
:
awk '{printf "Point{%d} = {%s, %s, %s};\n", NR+1000,$1,$2,$3}' file
printf
отформатируйте вывод по желанию.NR+1000
номер строки внутри файла +1000.$1,$2,$3
поля с 1 по 3.
Вы действительно правы, что создание такого количества файлов не является необходимым, 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.