以下に、次の方法でファイルのセグメント内でデータを収集するためにファイル行を繰り返すコードを配置しました。
プロセス図の理解:
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
2節:33
より大きなサンプルでは、上記のような出力を使用してデータを最大100〜120のセグメントに保存する必要があります。
同じ出力を達成するための代替案(データポイントを格納するための2D配列に似たオブジェクト)を考えることはできますか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