循环文件行、分区文件并对每个分区进行分类

循环文件行、分区文件并对每个分区进行分类

在下面,我放置了用于迭代文件行的代码,以便以以下方式从文件中收集段内的数据:

理解过程图解:

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

稍后,对于一个包含 10000 行的文件,我想将文件分成长度相等的段,下限为segLsegH=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
分段 2: 33

对于较大的样本,我需要将数据存储到最多 100-120 个段中,并具有上述类似的输出。

您能想到实现相同输出的替代方案(用于存储数据点的类似二维数组的对象,例如A(segment1|<count of integers>)

答案1

我不确定我是否正确理解你的问题......

#!/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

相关内容