Перебирайте строки файла, файла раздела и классифицируйте каждый раздел

В следующем примере я установил свой код для итерации по строкам файла, чтобы собирать данные в сегменте из файла следующим образом:

Иллюстрация для понимания процедуры:

segL segH | | [ 2 4 9 15 25 45 ... 99 ] 102 136 ... 206 

Позже, для файла с 10000 строк я хотел бы разделить файл на сегменты равной длины с нижней границей segL и segH=segL+segsize .
Просматривая файл, я хотел бы подсчитать количество целых чисел, удовлетворяющих следующему условию:
segL < integer =< segH . Затем это число должно храниться в переменной, уникально содержащей количество целых чисел только для этого самого сегмента!

Код

 segsize=100 segL=0 segH=100 blockcounter=0 segment1=0 segments2=0 #Go through input and partition it for i in {1..2} do while read p; do if [ $p -gt $segL ] && [ $p -le $segH ] then blockcounter=$(($blockcounter + 1)) fi done <$inputfile if [ "$i" -eq "1" ] then segment1=$blockcounter echo "segment1: $segment1" fi if [ "$i" -eq "2" ] then segment2=$blockcounter echo "segment2: $segment2" fi blockcounter=0 segL=$segH segH=$(($segL + $segsize)) done 

Прямо сейчас, в моем коде, я могу собирать данные только для 2-х сегментов – с моим файлом, в настоящее время содержащим более 200 целых чисел (2 * сегмента).

Вывод:

сегмент1: 27
segment2: 33

Для более крупных образцов мне нужна помощь для хранения данных до 100-120 сегментов с аналогичным выпуском, упомянутым выше.

Можете ли вы подумать об альтернативах для достижения того же выхода (2D-массив, как объект для хранения точек данных, например A(segment1|<count of integers>) ?

One Solution collect form web for “Перебирайте строки файла, файла раздела и классифицируйте каждый раздел”

Я не уверен, что правильно понимаю вашу проблему …

 #!/bin/bash segsize=100 segL=0 max=0 a=() while read p; do (( n = (p - segL - 1) / segsize )) if (( n + 1 > max )); then for ((i = max; i < n + 1; i++)) do a+=(0) done (( max = n + 1 )) fi (( a[n]++ )) done for ((i = 0; i < max; i++)); do echo "segment $((i+1)) ($((segsize*i)), $((segsize*(i+1)))] : ${a[$i]}" done 

Вход (каждый номер должен быть> 0):

 1 100 101 200 1000 1001 

Вывод:

 segment 1 (0, 100] : 2 segment 2 (100, 200] : 2 segment 3 (200, 300] : 0 segment 4 (300, 400] : 0 segment 5 (400, 500] : 0 segment 6 (500, 600] : 0 segment 7 (600, 700] : 0 segment 8 (700, 800] : 0 segment 9 (800, 900] : 0 segment 10 (900, 1000] : 1 segment 11 (1000, 1100] : 1 
  • Удалить символы строки строки из stdout? Несколько строк в одну строку
  • Как мне ожидать «echo -e»? \ С»?
  • извлечение строки bash
  • задать путь библиотеки для текущего скрипта
  • grep для извлечения подстрок в строке
  • Каковы могут быть причины, по которым сценарии оболочки убивают себя?
  • Сценарий Bash для мониторинга безопасности сервера?
  • Считать количество вхождений регулярного выражения в круглых скобках
  • Использование веб-браузера для создания галереи / слайд-шоу из локальных файлов
  • Bash: слияние имени папки из переменной с именем файла
  • zsh: команда map для массива
  • Linux и Unix - лучшая ОС в мире.