前の行より大きい場合にのみ逆方向に行を引く方法

前の行より大きい場合にのみ逆方向に行を引く方法

私はファイルの行を逆に読み取るシェルスクリプトを書いています。後者から前の行を引く必要がありますが、後者が大きい場合にのみ可能です。小さい場合は、その行の数だけが必要です。

例:

文書の内容:

100
200
300
100
300

結果は次のとおりです。

200     # line 5 - line 4    
100     # line 4 (as it's < line 3) 
100
100

値が> =かどうかにかかわらず、前の行を減算するために使用するコードは次のとおりです。

awk 'p{print $0-p}{p=$0}' inputfile > outputfile

それでもこれを行う必要がありますが、値が前の行よりも大きい場合にのみ可能です。

私はwhile readループを使うつもりですが、比較する各行に変数を代入するなどの操作は本当に脳集約的です。よろしくお願いします!

ベストアンサー1

tacファイルの行の順序を変更するのに便利です - (BSDtail -rも行の順序を変更できます)

tac file | awk 'p { if( p>$1 ) print p-$1; else print p } { p=$1 }' 

何らかの理由でtacawkを使用できない場合、または排他的に使用したい場合は、配列を介してファイルawk全体をメモリに読み込んだ後、END{}配列を逆の順序で処理できます。

awk '{ r[i++]=$0};  END{ for(i=i-1; i>=0; i--) 
       if( r[i+1] ) if( r[i+1]>r[i] ) print r[i+1]-r[i]; else print r[i+1] 
     }' file

おすすめ記事