0

最初に、ジョブのリストをファイルから配列に入力しようとしています。次に、それらのジョブに関する情報を含むログ ファイルから読み取ろうとします。この情報を使用して、抽出したデータを配列に追加したいと考えています。しかし、私は問題に遭遇しました。最初は、「{ジョブ}、{タイプ}、{ログ}、{プロセス}、「ログからの文字列データ」」という形式でコードが出力されます。ただし、私のコードで何かが発生し、出力が次のようになりました。基本的に、配列の最初の部分を、最後に追加するのではなく、抽出された文字列データに置き換えます。コードは次のとおりです。

#!/user/bin/ksh93

log="./20130603.log"
list="./working_joblist.dat"
line="./linenum.dat"

# Populate JobArray (TESTING DONE)
i=0
listLines=$(wc -l < $list)

while [[ $i -lt $listLines ]]
do
    JobArray[$i]=$(awk 'NR>=j+2 && NR<j+3 {print $0}' j=$i $list)
    let i=$i+1
done

#READ BEGINS HERE
# Loop through this logic for each index in array
i=0

#server will be a parameter
server="MVS1"

# Grab line number based on the type of server the log came from
linenum=$(awk -F"," '/'"$server"'/{print $2}' $line)

while [[ $i -lt ${#JobArray[@]} ]]
do
    # Assign job to first field in array
    job=$(echo ${JobArray[$i]} | awk -F"," '{print $1}')

    # Initialize startTime if it already exists
    startTime=$(echo ${JobArray[$i]} | awk -F"," '{print $8}')

    # Set up conditional variable       
    state=""        
    if [[ $state = "" ]];then
        # Try to get ended ok data for job
        data=$(awk 'NR>='"$linenum"' && /'"$job"'.*ENDED OK/{
            status = "GREEN,  "
            date = $1",  "
            endTime = $2",  "
            if (startTime == ""){
                # Calculate start time using the ending time and elapsed time
                startTime=endTime-$14",  "
            }
            data=status date startTime endTime
            print data
        }' $log)

        # Assign status data to state. Will determine if match was found
        state=$(echo $data|awk -F"," '{print $1}')

        #if [[ $state = "GREEN" ]];then
            # Remove the job from the working_joblist
            #grep -v "$job" $list > ./truncated
        #fi
    fi  
    if [[ $state = "" ]];then
        # Try to get ended notok data for job
        data=$(awk 'NR>='"$linenum"' && /'"$job"'.*ENDED NOTOK/{
            status = "RED,  "
            date = $1",  "
            endTime = $2",  "
            if (startTime == ""){
                # Calculate start time using the ending time and elapsed time
                startTime=endTime-$14",  "
            }
            data=status date startTime endTime 
            print data
        }' $log)

        # Assign status data to state. Will determine if match was found
        state=$(echo $data|awk -F"," '{print $1}')
    fi
    if [[ $state = "" ]];then
        # Try to get start data for job
        data=$(awk 'NR>='"$linenum"' && /'"$job"'.*STARTED/{
            status = "YELLOW,  "
            date = $1",  "
            startTime = ",  "
            endTime = ",  "
            data=status date startTime endTime
            print data
        }' $log)

        # Assign status data to state. Will determine if match was found
        state=$(echo $data|awk -F"," '{print $1}')
    fi  
    if [[ $state = "" ]];then
        #Try to get waiting data for job
        data=$(awk 'NR>='"$linenum"' && /'"$job"'.*WAITING/{
            status = "BLUE,  "
            date = $1",  "
            startTime = ",  "
            endTime = ",  "
            data=status date startTime endTime
            print data
        }' $log)

        # Assign status data to state. Will determine if match was found
        state=$(echo $data|awk -F"," '{print $1}')
    fi  
    if [[ $state = "" ]];then
        data="WHITE,  ,  ,  ,"
    fi

    # Append data to array
    JobArray[$i]=${JobArray[$i]}$data
    print ${JobArray[$i]}

    # Iterate
    i=$i+1  
done

複数の修正を試みました。データ変数をそれ自体に追加して、$data$data を出力できます。また、${JobArray[$i]}${JobArray[$i]} を使用すると、JobArray はそれ自体を上書きします。これにより、アレイの一部がオフになっていると思われます。また、この印刷コマンドによって出力される最後の行は正しく、それより前のすべての行にはこのエラーがあります。

4

1 に答える 1

0

問題は、12行目のブロックの配列に文字列が最初に格納された方法にあったようです。以下は、同じ問題を抱えている人のための私の解決策です:

while [[ $i -lt $listLines ]]
do
    JobArray[$i]=$(awk -F"," 'NR>='"$i"'+2 && NR<'"$i"'+3 {
        print $1",  "$2",  "$3",  "$4",  "
    }' $list)
    let i=$i+1
done
于 2013-07-01T18:40:49.173 に答える