URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8607
[ Назад ]

Исходное сообщение
"Вложенный цикл"

Отправлено Бегемот , 01-Фев-10 13:46 
Всем здравствуйте.
Есть задачка, но сам одолеть не могу.
Существует некий произвольный список IP адресов. Количество IP неизвестно и всякий раз отличное. Нужно - раскидать этот список по файлам по возможности на равные части. Количество частей может быть тоже разным 2, 3, 4 и т.д.

Попробовал через вложенный цикл, получается не так.

cat spisok
192.168.1.23
192.168.1.27
192.168.1.28
192.168.1.29
192.168.1.30
192.168.1.31
192.168.1.32
192.168.1.34
192.168.1.35
192.168.1.36
192.168.1.37
192.168.1.38
192.168.1.39
192.168.1.40
192.168.1.43
192.168.1.45
192.168.1.46
192.168.1.47
192.168.1.48
192.168.1.49
192.168.1.50
192.168.1.51

cat test.sh
#!/bin/sh
while read stroka; do
       i=0
       while [ $i -lt 4 ]; do
               echo $stroka >>$i
               i=$(expr $i + 1)
        done
done < spisok


В результате получается 4 одинаковых с исходным файла.
А надо чобы считывая первую строку кидаем её в 1 файл, считываем 2 - во 2 файл, 3 в 3, 4 в 4, а вот 5 снова в 1 файл и т.д. до конца исходного spiska
Короче чтобы получилось типа этого
cat 1
192.168.1.23
192.168.1.30
192.168.1.35
192.168.1.39
192.168.1.46
192.168.1.50

cat 2
192.168.1.27
192.168.1.31
192.168.1.36
192.168.1.40
192.168.1.47
192.168.1.51

cat 3
192.168.1.28
192.168.1.32
192.168.1.37
192.168.1.43
192.168.1.48

cat 4
192.168.1.29
192.168.1.34
192.168.1.38
192.168.1.45
192.168.1.49


Как побороть? Заранее спасибо.

Содержание

Сообщения в этом обсуждении
"Вложенный цикл"
Отправлено Pahanivo , 01-Фев-10 13:53 
я так понял что таким незатейлевм образом пытаешьс развети флейм? или реально так сложно? ))

#!/bin/sh
i_min=0
i_max=5
i=$i_min
while read stroka; do
   echo $stroka >>$i
   i=$(expr $i + 1)
   if ($i gt $i_max) then
       i=$i_min
   fi
done < spisok


"Вложенный цикл"
Отправлено Бегемот , 01-Фев-10 14:39 
>[оверквотинг удален]
>i_min=0
>i_max=5
>i=$i_min
>while read stroka; do
>   echo $stroka >>$i
>   i=$(expr $i + 1)
>   if ($i gt $i_max) then
>       i=$i_min
>   fi
>done < spisok

О! Да.. мгновенно, снимаю шляпу перед мэтром.
Каюсь, ничего развести не хотел, тупняк нашел. =)
Тока у мну во фряхе шлифануть пришлось до


#!/bin/sh

i_min=1
i_max=4
i=$i_min
while read stroka; do
   echo $stroka >>$i
   i=$(expr $i + 1)
   if [ $i -gt $i_max ]; then
       i=$i_min
   fi
done < spisok



"Вложенный цикл"
Отправлено jd , 01-Фев-10 17:59 
#!/bin/sh
num=5
i=0
while read line; do
  echo $line >> $i
  i=$(expr \( $i + 1 \) % $num)
done


"Вложенный цикл"
Отправлено jd , 01-Фев-10 18:00 
да-да, я именно то самое развожу... :)

"и я, и я тоже! :D"
Отправлено Andrey Mitrofanov , 01-Фев-10 18:16 
... |gawk -v NUM=4 '{i=NR%NUM;print >>i}'