シェルスクリプトでリストから近い時間のものを抽出したい。


このようなリストがあります。このリストは標準入力から入力されます。

[code]

    -06
    26
    56
    -07
    26
    54
    -08
    27
    55
    -10
    01
    -11
    01
    -12
    01
    -13
    01
    52
    -14
    52
    
[/code]

次にdateコマンドで時刻を取得し変数に格納します。

そして最初にリストにある時間で最も近い時間を捜索します。  
次にそこから３つの時刻を取得して返すようにしたいです。

たとえば８時30分であれば配列で「0855 1001 1101」を返します。  
また16時であればそれ以上直近のものがないのでその場合は最初に戻り翌日の6時のものから捜索し数字冒頭に99を付加した「990626 990656
990726」を返したいです。これは他にもデーターを処理して近い順にソートする際に当日のものが別のデーターに含まれていた場合に翌日のものが当日のものより早くなってしまうことを防ぐためにつけるものです。

お手数おかけしますがよろしくおねがいします




とりあえず sed と awk と/bin/sh で書いてみました。  
ただしある程度複雑なテキスト処理になったらシェルスクリプトではなくもう少し高機能なスクリプト言語(perl, python, ruby
など)で書いた方が性能も保守性もよくなるかと思います。

[code]

    #! /bin/sh
    
    # 1. create today table
    TMP_FILE=`mktemp`
    awk -F'-' 'BEGIN{OFS=""} {if ($2 != "" ) hour=$2; else print hour, $1}' - > ${TMP_FILE}
    
    # 2. create today and tommorow table
    TMP_FILE2=`mktemp`
    cat ${TMP_FILE} >> ${TMP_FILE2}
    sed -e s/^/99/g ${TMP_FILE} >> ${TMP_FILE2}
    
    # 3. get current time
    NOW=`date +%H%M`
    #NOW=0830 # for test
    #NOW=1600 # for test
    
    # 4. search 3 items after NOW
    awk "{ if (\$0 >= \"$NOW\") print \$0 }" < ${TMP_FILE2} | head -3
    
    # 5. clean up tmp files
    if [ -f ${TMP_FILE2} ]; then
        rm ${TMP_FILE2}
    fi
    
    if [ -f ${TMP_FILE} ]; then
        rm ${TMP_FILE}
    fi
    
[/code]

