LINUX.ORG.RU

Генерация список в цикле for

 , ,


0

1

Есть данные в таком виде:

cat список
aaaaa 11111
bbbbb 22222
ccccc 33333

cat шаблон
<<<<<<<<буквы>>>>>>>>>
----------------------
<<<<<<<<цифры>>>>>>>>>
----------------------

Есть такой скрипт

строки=$(cat список)
for arg in $строки
do
cat шаблон | sed s/буквы/$arg/ >> цель
done

arg прнимает значения aaaaa потом 11111 потом bbbbb, хотя я рассчитывал что он будет воспринимать целую строку. Как его заставить заменять буквы буквами, а цифры цифрами?

Результат я хочу получить такой:

cat цель
<<<<<<<<aaaaa>>>>>>>>>
----------------------
<<<<<<<<11111>>>>>>>>>
----------------------
<<<<<<<<bbbbb>>>>>>>>>
----------------------
<<<<<<<<22222>>>>>>>>>
----------------------


Последнее исправление: vachicul (всего исправлений: 1)
Ответ на: комментарий от wandrien

А можно приблизительно хотя бы продемонстрировать что бы увидеть длинну кода?

Я свою задачу решил так:

cat список
aaaaa-11111
bbbbb-22222
ccccc-33333

cat шаблон
<<<<<<<<буквы>>>>>>>>>
----------------------
<<<<<<<<цифры>>>>>>>>>
----------------------

cat scr
строки=$(cat список)
for arg in $строки
do
n1=$(echo $arg | cut -d"-" -f1)
n2=$(echo $arg | cut -d"-" -f2)
cat шаблон | sed s/буквы/$n1/ | sed s/цифры/$n2/ >> цель
done

sh scr
cat цель
<<<<<<<<aaaaa>>>>>>>>>
----------------------
<<<<<<<<11111>>>>>>>>>
----------------------
<<<<<<<<bbbbb>>>>>>>>>
----------------------
<<<<<<<<22222>>>>>>>>>
----------------------
<<<<<<<<ccccc>>>>>>>>>
----------------------
<<<<<<<<33333>>>>>>>>>
----------------------

Но мне пришлось пробел заменить на разделитель «-»

Можете ваш вариант продемонстрировать?

vachicul
() автор топика
Ответ на: комментарий от menangen

Сколько будет стоить времени выучить Python без знаний английского и как сильно это облегчит выполнение программы?

vachicul
() автор топика
Ответ на: комментарий от vachicul

Весь питон учить не нужно, достаточно выучить модуль re - это пара часов времени. Пригодится так же в других областях.

anonymous
()
Ответ на: комментарий от anonymous

выучить модуль re

Если немножко переделать шаблон, то даже регулярки не нужны:

$ cat шаблон
<<<<<<<<{буквы}>>>>>>>>>
----------------------
<<<<<<<<{цифры}>>>>>>>>>
----------------------

$ cat script.py
шаблон = open('шаблон').read()
список = open('список')

for строка in список:
    буквы, цифры = строка.split()
    print(шаблон.format(**locals()))

$ python script.py
<<<<<<<<aaaaa>>>>>>>>>
----------------------
<<<<<<<<11111>>>>>>>>>
----------------------
<<<<<<<<bbbbb>>>>>>>>>
----------------------
<<<<<<<<22222>>>>>>>>>
----------------------
<<<<<<<<ccccc>>>>>>>>>
----------------------
<<<<<<<<33333>>>>>>>>>
----------------------
anonymous
()
Ответ на: комментарий от vachicul

Не учи питон учи джаву или голанг мир не потерпит ещё одного python-mako , а ведь его для облегчения графики можно было ещё тогда убрать , питон хорош как прокладка прослойка , но плох когда внедряется в бинарь потому что может нести на борту вирусы или следилки которые могут генерировать прибыль не хорошему человеку как какая нибудь призма от мозилы

anonymous
()
Ответ на: комментарий от akk

а чем же, позволь поинтересоваться, настолько плохи cat file | sed и sed | sed, что это вызывает в тебе желание бить людей?

anonymous
()
Ответ на: комментарий от anonymous

Покажите пожалуйста пример прокладки

vachicul
() автор топика
Ответ на: комментарий от anonymous

cat file |tee | sed |tee

вот так вообще збс

anonymous
()
Ответ на: комментарий от akk

Прежде чем обсирать, покажи свой вариант неговнокода

vachicul
() автор топика

babashka рулит

нет бы пользоваться пайпами здорового человека

(let [tpl (slurp "шаблон")]
  (->> (slurp "список") ; считали файл
       str/split-lines ; разделили по строкам
       (map #(str/split % #" ")) ; разделили каждую строку по пробелам
       (map (fn [[c d]]
              (str/replace tpl #"буквы|цифры" {"буквы" c "цифры" d}))) ; заменили в шаблоне
       str/join ; склеили
       (spit "цель"))) записали в файл
anonymous
()
Ответ на: babashka рулит от anonymous

Длина кода не меньше. Чем этот код лучше? Меньше нагрузка на процессор? Чем хуже шелл пайпы?

vachicul
() автор топика
Ответ на: комментарий от vachicul

Длина кода не меньше.

тебе жалко десятка байт?

Чем хуже шелл пайпы?

если нужно слепить больше, чем две команды в консольке - примерно всем:

  • quoting hell в шеллах это отдельная история, породившая, не побоюсь этих слов, миллионы багов

  • читабельность, большинство кода читается гораздо чаще, чем пишется, имена юниксовых команд - само по себе зло (ls/mv/fck), а уж приправленный вышеуказанным hell-ом, регулярками, неконсистентностью вызовов/параметров/выхлопа становится неподдерживаемым достаточно быстро

  • нельзя удобно сохранить промежуточный результат выполнения, всякие $($($($($($($(foo)))))) можно видеть сплошь и рядом

  • типизация в баше? ахахахаха

  • неидемпотентное поведение программ, зависящее от кучи переменных окружения, многие из которых выставил непонятно кто и непонятно где

anonymous
()
Ответ на: комментарий от anonymous

Понятно что ничего непонятно. Однако мне ясно то что я пытался начать учить пайтон и понял что это слишком сложно. Баш более высокоуровневый, всё что мне нужно сделать с системой можно выполнить довольно быстро из терминала. Готовые программы сводят рутину к вводу одной строчки.

vachicul
() автор топика
Ответ на: комментарий от vachicul

Я не говорил, что так делать нельзя. Я говорил, что так делать не надо.

sed сам умеет читать из файла. Зачем тут cat?

Зачем несколько запусков sed, если в скрипте (том, что после -e) можно написать любое число команд?

akk ★★★★★
()

Какой ещё shell? Такое принято обрабатывать на Perle или Питоне, в зависимости от того на чем быстрее написать.

anonymous
()
Ответ на: комментарий от akk

Тем, что это *овнокод.

Ну так а что в нём говённого-то? Разверни. А то какая-то детсадовская позиция получается: «потому что».

А знаешь почему ты поставил звёздочки в слове «говнокод»? Ведь это же не мат. Смотри, я могу написать: твоя мать испражняется говном — и этот комментарий даже не удалят. А ты ставишь звёздочки потому, что на самом деле глубоко переживаешь за насиженные шкворец и звёзды, боишься потерять драгоценное виртуальное «уважение». Но страх не возникает на пустом месте. Твой страх — от непонимания, незнания того, что именно ты делаешь и какие это повлечёт последствия. И знаешь что это? — Это идеальная характеристика глубоко зависимого от общественного мнения человека, человека без собственных идей и мыслей, человека-пустышки, формалиста, если хочешь.

Твой короткий и по-детски забавный ответ на изначальный вопрос как нельзя лучше подтверждает эти выводы.

anonymous
()
Ответ на: комментарий от akk

sed сам умеет читать из файла.

И так же умеет читать из stdin.

Зачем тут cat?

Человеку так захотелось. Что в этом плохого? Неужели за это нужно его бить?

anonymous
()
Ответ на: комментарий от akk

Почему так делать не надо? С саt я понял что нет смысла. А как sed запустить на подставку двумя разными переменными в разных местах шаблона?

vachicul
() автор топика
Ответ на: комментарий от anonymous

Из анонима диагност по интернету как из говна пуля.

akk ★★★★★
()
#!/usr/bin/pwsh -NoLogo

Get-Content шаблон | Foreach-Object {
   foreach ($i in $_.Split())
   {
       "<<<<<<<{0}>>>>>>" -f $i
       "------------------"
   }
} | Set-Content цель
anonymous
()
Ответ на: комментарий от anonymous

Не вижу коде «список». Он учитывает пробел? Шаблон будет гораздо сложнее, это не две простые строки.

vachicul
() автор топика
Ответ на: комментарий от vachicul

Баш более высокоуровневый, всё что мне нужно сделать с системой можно выполнить довольно быстро из терминала. Готовые программы сводят рутину к вводу одной строчки.

только чтобы сформулировать эту строчку, при этом чтобы она нормально безошибочно работала, ты потратишь, в лучшем случае, часы.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.