0 / 0 / 0
Регистрация: 21.06.2015
Сообщений: 2
1

Скрипт "Добавление случайного числа в последовательность чисел"

21.06.2015, 21:08. Показов 1915. Ответов 3
Метки нет (Все метки)

Добрый вечер!
Возникла необходимость написать скрипт.
С bash не особо дружу.
Есть текстовый файл, в нем 1000000 строк.
В строках числа.
Числа (целые) случайны и отсортированы от меньшего к большему.
Пример списка :
Код
1                    423542

2                    5656990

3                    654632565

4                    4626462266

……
1000000 5467039267546874265627695876539867

Нужно записать число (случайное) в файл, так чтобы не нарушить сортировку и вывести номер строки, в которую было записано число.
Из идей:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
 
echo -n "Введите число: "
read var1
 
 
file="/root/test/loop.txt"
while read line
do
(if [ "$var1" -le "$line" ]; #Читаем построчно, пока не выполниться условие 
    then
echo "$line"
    else
echo
fi)
 
done <$file
на выходе получаем значения которые меньше веденного числа.

Пытался с помощью
Bash
1
sed -n "/${line}/{=;p;}"
Результатов нет. Возможно в не том направлении иду.
Прошу помочь.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.06.2015, 21:08
Ответы с готовыми решениями:

Как заменить цифры "0" на буквы "o" в словах, пропуская числа?
Помогите пожалуйста написать условие для строк. К примеру если я ввожу с клавиатуры число 1200,...

Исправить скрипт выдающий ошибку "unexpected eof"
Скрипт перекодировки файлов с режимом &quot;защиты&quot;, если введеный ранее ключ=1, то перед каждой...

Да, да. Очередная тема "помогите написать shell скрипт"
Написать shell-процедуру, которая: Читает содержимое двух файлов, передаваемых в качестве первых...

Как написать скрипт который будет запускать файл ".js" через терминал Ubuntu?
Приветствую Всех ! Совсем недавно я установил UBUNTU чтобы запустить через терминал один файл ...

3
Модератор
Эксперт NIX
2792 / 2035 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
22.06.2015, 00:01 2
Bash
1
2
3
4
5
#!/bin/bash
read -p "Введите число: "
awk 'a < $0 && ! row { row = NR ; print a } 1
     END { print row > "/dev/stderr" }' a="$REPLY" "/root/test/loop.txt" > "/root/test/loop.tmp"
mv -f "/root/test/loop."{tmp,txt}
0
0 / 0 / 0
Регистрация: 21.06.2015
Сообщений: 2
23.06.2015, 00:51  [ТС] 3
Доброй ночи!
Спасибо за решение!)
Не могли бы Вы пояснить третью строку, некоторые моменты в коде не понятны.

Со своей стороны попытался решить другим способом.
Прошу подсказать.
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
index=0
while read line;
   do
       array[$index]="$line"
       index=$((index+1))
  done < /root/test/loop.txt
echo -n "Введите число: "
read N
i=0
for Ai in ${array[@]}; do
    if [[ "$Ai" -gt "N" ]]; then
    echo "Position of $N is $i"
   exit 0
    fi
   ((i++))
done
# Данный цикл выводит позицию "i", в которую нужно записать вводимое число "N". Далее возникла проблема с записью в нужную позицию.
#array[@]+=([$i]=$N)
#echo ${array[$i]}
#а далее
i=0
for i in "${array[@]}"; do
echo $i >> /root/test/loop.tmp ;
((i++))
done
mv -f /root/test/loop."{tmp,txt}
Возможно ли использовать данное решение? Сразу уточню что не сделал проверку на корректность вводимых данных.
0
Модератор
Эксперт NIX
2792 / 2035 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
23.06.2015, 10:51 4
Лучший ответ Сообщение было отмечено NeoMatrix как решение

Решение

Цитата Сообщение от Сергей2204 Посмотреть сообщение
Возможно ли использовать данное решение
Подставляйте данные и проверяйте, в чем проблема.
Цитата Сообщение от Сергей2204 Посмотреть сообщение
пояснить третью строку
Вывести введенное число а когда оно будет больше чем число в строке но только 1 раз (т.е. первое совпадение), что достигается за счет переменной row, которая когда не инициализирована => равна <пусто> (это такая фишка bash и ему подобных), т.е. выражение ! row истинно, а когда инициализируется (при первом совпадении становится равным номеру строки и не равным 0), то выражение становится ложным и код больше не выполняется. «1» — это такой bashизм, сокращение для {print}. Согласно ману awk его команда может содержать условие и/или операцию(-и). Операция по умолчанию — print, т.е. если не указана, то выполняется по умолчанию. 1 — истина.
Что касается Вашего кода, то любой вариант имеет право быть, только как бы Вы не казались себе гением программирования, он весьма не оптимален. Конечно вычислительные мощности современных компьютеров позволяют не особенно заморачиваться скоростью выполнения, но, как мне кажется, в любом случае стоит искать оптимальное решение. Главное замечание — 3 цикла, которые каждый раз прогоняют весь файл, когда можно (и нужно) делать все необходимое в один проход. Тем более что ничто не мешает Ваш метод слить в 1 цикл:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
echo -n "Введите число: "
read N
unset index position
 
while read line;
do
    ((++index))
    if [[ "$line" -lt "$N" ]];
    then
        position="$index"
    elif [[ "$((position + 1))" -eq "$index" ]]
    then
        echo $N
    fi
    echo "$line"
done < /root/test/loop.txt > /root/test/loop.tmp
mv -f /root/test/loop."{tmp,txt}
echo "Position of $N is $((position+1))"
Хотя с флагом — оптимальнее.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.06.2015, 10:51
Помогаю со студенческими работами здесь

Скрипт, который определяет много или мало файлов текущего каталога содержат слово "hello"
Необходимо написать скрипт, который определяет много или мало файлов текущего каталога содержат...

скрипт удаления файлов "не в списке"
Здравствуйте Есть директория, в которой ~250000 картинок и список картинок из ~35000 шт в файле...

Скрипт "Создание пользователей"
Добрый вечер! Помогите пожалуйста написать скрипт &quot;создание пользователей&quot;. Использую систему ASP...

Как вывести все строки, находящиеся между словами "start" и "stop"?
Требуется вывести на терминал с помощью awk, все строки, находящиеся между словами &quot;start&quot; и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru