2016-08-30 21 views
1

私は以下のような内容のファイルを持っています。while条件whileループbash

864440 17:59:48.143 
864440 17:59:48.221 
864441 17:59:48.159 
864441 17:59:48.221 
864442 17:59:48.159 
864442 17:59:48.237 
864443 17:59:48.174 
864444 17:59:48.190 
864444 17:59:48.253 
864445 17:59:48.206 
864445 17:59:48.268 
864446 17:59:48.221 
864446 17:59:48.284 

私は1番目と2番目の値を読み取るためにwhileループを実行しています。

私はjbnumは、次の反復に等しいならば、何もしないし、次の反復に

を行っていない場合、それは同じジョブ番号の時間差になるだろうということであれば条件を追加したいと思います

while read list; do 
    jbnum=`echo $list|awk '{print $1}'` 
    time=`echo $list|awk '{print $2}'` 
done < jobstmp.txt 

あなたのアプローチは、あなたが$list解析する必要はありません方法で改善することができるクリスマース

while read jobnum time 
do 
    if [[ "$prevjobnum" == "$jobnum" ]] 
    then 
     ENDTIME=`date +%s.%N -d "$time"` 
     STARTTIME=`date +%s.%N -d "$prevtime"` 
     DIFF=$(echo $ENDTIME - $STARTTIME | bc | sed 's/0\{1,\}$//') 

     echo "$prevjobnum time is $DIFF seconds" 
    fi 
    # keep variables for next iteration 
    prevjobnum=$jobnum 
    prevtime=$time 
done < jobstmp.txt 
+1

たとえば、後で864440が発生するので、最初の行でアクションを実行しますか?ファイルを読むときには後ろ向きに進むことはできませんので、正確に何をしたいのかを明確にする必要があります。おそらく、フィールドが繰り返されていることに気づいたときに、次の行で行うことができるからです。 – fedorqui

+0

@fedorqui最初の列の値が次の繰り返しで同じ場合、何をしたいのかを正確に示すために質問を更新しました – Dren

+0

ありがとうございました!あなたの質問を完璧にするために、この入力に対する望ましい出力が何であるかも指定してください。 – fedorqui

答えて

1

はまた、あなたは、この機能を使用できるようにするには、データへのいくつかのマッサージを行う必要があります。いくつかの中間変数を使用する必要があります。以下のようなもの(あなたはすぐに複数の変数を読むことができることに注意してください):

while read jobnum time 
do 
    if [[ "$prevjobnum" == "$jobnum" ]] 
    then 
     #do your stuff with the variables $prevjobnum and $prevtime. for example: 
     echo "prevjobnum=$prevjobnum , prevtime=$prevtime" 
    fi 
    # keep variables for next iteration 
    prevjobnum=$jobnum 
    prevtime=$time 
done < jobstmp.txt 

これは与える:

prevjobnum=864440 , prevtime=17:59:48.143 
prevjobnum=864441 , prevtime=17:59:48.159 
prevjobnum=864442 , prevtime=17:59:48.159 
prevjobnum=864444 , prevtime=17:59:48.190 
prevjobnum=864445 , prevtime=17:59:48.206 
prevjobnum=864446 , prevtime=17:59:48.221 
+0

多くのありがとう。あなたのお勧めに基づいて私が探している解決策で質問を更新しました。応援メイト。 – Dren

0

注によって提供されたコードに基づいて、以下のソリューションに答えたすべての人に感謝します。 Read a file line by line assigning the value to a variableで説明したように、個別にそれらをキャッチするread var1 var2 var3...を使用する:あなたはより多くのでawkを使用することができ、以前のものと1列を比較するために、しかし

while IFS= read -r jbnum time; do 
    if [ "$prev_jbnum" == "$jbnum" ]; then 
     echo "they are equal!" 
    fi 
    prev_jbnum=$jbnum 
done < jobstmp.txt 

この方法で、あなたはこのようなコードを持つことができます簡単な方法:

$ awk '$1==prev {print $0, "equal!"} {prev=$1}' file 
864440 17:59:48.221 equal! 
864441 17:59:48.221 equal! 
864442 17:59:48.237 equal! 
864444 17:59:48.253 equal! 
864445 17:59:48.268 equal! 
864446 17:59:48.284 equal! 

最初のフィールドが一致したときに、あなたがのようなものを使用することができる時間を比較するために、、それはミリ秒を処理しません。あなたが読むと前方に見ることができない

{ 
gsub(/[^0-9]/, " ", $2)    # replace every : and . with spaces 
current_time=mktime("1970 01 01 " $2); # generate a date prepending 1/1/1970 
} 
+0

awkコマンドが前の行を印刷していないと思われます。最初の行は "864440 17:59:48.143" –

+0

にする必要があります。@ChrisMaes最初の列が繰り返されるときに発生する行を印刷しています。私は彼が探しているものはあまり明確ではないので、OPにいくつかの明確化を求めるだろう。 – fedorqui

+0

私は彼の質問がうまく書かれていないことに同意するが、彼の最後の行から;私は彼が最初の行を望んでいると推測します。 –

0

あなたのIDはあなたが持つ最初の行をフィルタリングするuniqを使用することができ、常に6つの文字の幅である場合

$ echo """864440 17:59:48.143 
864440 17:59:48.221 
864441 17:59:48.159 
864441 17:59:48.221 
864442 17:59:48.159 
864442 17:59:48.237 
864443 17:59:48.174 
864444 17:59:48.190 
864444 17:59:48.253 
864445 17:59:48.206 
864445 17:59:48.268 
864446 17:59:48.221 
864446 17:59:48.284""" | uniq -w 6 

864440 17:59:48.143 
864441 17:59:48.159 
864442 17:59:48.159 
864443 17:59:48.174 
864444 17:59:48.190 
864445 17:59:48.206 
864446 17:59:48.221 

出力行を繰り返して、最初のフィールド値で1回だけ実行する必要がある操作を行うことができます。

uniqが正しく動作するためには、データをソートする必要があることに注意してください。

+0

私に最初の発生のように見えません...最初の行は "864440 17:59:48.143" –

0

私は内部のあなたの計算を実行し、あなたのループ

read line 

while read nextLine; do 
    jbnum=`echo $line|awk '{print $1}'` 
    time=`echo $line|awk '{print $2}'` 

    nextjbnum=`echo $nextLine|awk '{print $1}'` 
    nexttime=`echo $nextLine|awk '{print $2}'` 

    if [jbnum == nextjbum]; then 
     DO STUFF .... 
    fi 

    #Then save the current line before processing the next 
    line=nextLine 
done 
+0

良いアイデアにする必要があります。未定義の変数$ listを使用しています。あまり最適でない多くのサブプロセスを起動しています。 –

+0

それは悪いコピー/貼り付けの問題です:-) そして、あなたは最適化について正しいかもしれません – Paradise228

0

前に、最初の読み取りを行うためにあなたをお勧めします

印刷$ 1、「//ここにあなたの計算を行う」

が含まれています{}
awk 'idMap[$1]==""{idMap[$1]=$2;print;next;}{print $1,"//do your calculation here"}' <filaname> 

生成される出力は、現時点では次のようになります。

864440 17:59:48.143 
864440 //do your calculation here 
864441 17:59:48.159 
864441 //do your calculation here 
864442 17:59:48.159 
864442 //do your calculation here 
864443 17:59:48.174 
864444 17:59:48.190 
864444 //do your calculation here 
864445 17:59:48.206 
864445 //do your calculation here 
864446 17:59:48.221 
864446 //do your calculation here