LINUX.ORG.RU

Помощь со скриптом

 , , , ,


0

2

Доброго, товарищи. Помогите со скриптом. Пытаюсь оптимизировать работу. Формирую файл с фамилиями учеников, добиваю разделителями строки так, чтобы во всех было одинаковое кол-во символов. После разделителей идут баллы. Никак не могу сообразить скрипт, который бы по заданной маске (например, где в строке меньше символов, чем я задаю) удалял их из файла. К примеру, файл содержит: Пупкин114 Иванов91 Петров99 Скрипт должен удалить все строки, где кол-во символов меньше 9 (остается только Пупкин114).

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

alozovskoy ★★★★★ ()

давай ты распишешь конечную задачу, вроде «есть файл a содержащий ..., требуется получить файл b содержащий ...»

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

Я вроде привел пример... Попробую по другому сформулировать. Есть файл, где в каждой строке разное кол-во символов. Мне нужно удалить из файла те строки, количество символов в которых меньше, чем заданное мной. Пример:

1111

111

11

1

В примере 4 строки. Я задаю количество символов 3 и скрипт удаляет все строки с количеством символов меньше 3. В итоге остается файл:

1111

111

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

Тоесть у вас есть файл вида:

Вася |||||||
Петя |||
Саша ||||
где | - означает 1 балл и нужно отобразить тольсок строки с определенным числом |? Так?

Deleted ()

Ты ведь понимаешь, что с такой постановкой задачи у тебя «Шпак» набравший 999 баллов в выходной файл не попадёт, а «Смоленцев» набравший 1 балл попадёт? Или у тебя все фамилии в списке имеют длину 6 символов?

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

Специально написал «добиваю разделителями строки так, чтобы во всех было одинаковое кол-во символов». Потом уже идут сами баллы. И разброс там не большой. Обычно баллы 70-150.

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

ну типа того

 cat test.txt|while read line; do 
 if [[ $(echo -n $line |sed s/[^\|]//g|wc -c) > 2 ]]; then 
  echo $line;
 fi;
done
где test.txt - имя файла, а 2 количество проходных баллов. Пример файла в сообщении выше.

Надеюсь кто-нибудь предложит более внятное решение

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

Специально написал «добиваю разделителями строки так, чтобы во всех было одинаковое кол-во символов»

man printf — он умеет сам добивать разделителями (справа или слева)

anonymous ()
Ответ на: комментарий от anonymous
$ awk '{printf(">%+20s<\n", $0)}' 1.txt
>           Пупкин114<
>            Иванов91<
>            Петров99<
$ awk '{printf(">%-20s<\n", $0)}' 1.txt
>Пупкин114           <
>Иванов91            <
>Петров99            <
anonymous ()
Ответ на: комментарий от zdravo

В током случае наверно имеет смысл строки не выравнивать, а читать каждую в две переменные и если значение второй больше скажем 100 записывать их в результат.

cPunk ★★ ()
Ответ на: комментарий от zdravo

Не правильный подход. Зачем выравнивать строки, если можно просто посчитать количество символов означающих 1 балл.

Deleted ()

Кто придумал такой метод хранения данных. Но если именно так как ты сказал, то я бы всё собрал в переменные, а потом переменные можно и через printf вывести и что угодно сделать. Единственное ограничение в фамилии должны отсутствовать цифры. Тогда все цифры — отметка, все не цифры — фамилия.

$ username=$(echo Пупкин114 | sed -n 's/[[:digit:]]//gp')
$ mark=$(echo Пупкин114 | sed -n 's/[^[:digit:]]//gp')
$ printf "%-30s %5s\n" $username $mark
Пупкин                     114
Чтобы не гадать хватит ли 30 символов для фамилии, можно предварительно в цикле посчитать максимальную длину username.

justAmoment ★★★★★ ()
Последнее исправление: justAmoment (всего исправлений: 1)

может стоило работать с sql (sqlite)?
или выбор инструментов имеет академический характер?

bl ★★★ ()

Не умеешь писать скриптами - напиши на любом из известных компилируемых ЯП бинарник который делает тоже самое. За то время что спрашиваешь, уже написал бы - работа с файлами и строками, это же там самое простое.

Napilnik ★★★★★ ()

Формирую файл с фамилиями учеников, добиваю разделителями строки так, чтобы во всех было одинаковое кол-во символов. После разделителей идут баллы.

Может быть, я что-то недопонял, но есть мнение, что лучше не «добивать разделителями», а формировать csv-файл и обрабатывать его хоть шеллом, хоть перлом, хоть питоном, хоть LibreOffice Calc'ом.

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