2

コマンドラインで次のコマンドを実行します。

prog1 | prog2

上記の出力(たとえば、X)は、FA34などの4桁の16進数です。 prog1シリアルで100msごとにデータを読み取るJavaプログラムです。必要な部分を切り取るコマンドですprog2cutこれは正常に機能し、標準出力で100ミリ秒ごとに目的の値を確認できます。

私が欲しいもの:

prog1 | prog2 | <convert X to decimal> | <multiply by 2>

パイプを使用するかどうかに関係なく、コマンドラインでワンゴーでこれを行う方法は?

注:Xを10進数に変換し、2を掛けるbashスクリプトを作成しましたが、引数としてXをスクリプトに挿入することはできませんでした。

4

4 に答える 4

3
prog1 | prog2 | xargs -I ^ printf "%d * 2\n" 0x^ | bc

説明:

%dで印刷すると10進数に変換され、bcは乗算を行います

于 2012-12-06T13:58:13.117 に答える
1

これにより、prog2の出力が変数vに読み取られ、それが10進数に変換され(基本表記を使用16#v)、2が乗算されます。

prog1 | prog2 | ( read v ; let v=16#$v*2 ; echo $v )

ストリームに複数の番号が含まれている場合は、最後の部分を次のように変更します

( while read v ; do let v=16#$v*2 ; echo $v ; done )
于 2012-12-06T13:53:44.247 に答える
1

パイプでこれを行うには、次を使用できますperl

    prog1 | prog2 | perl -ne 'printf ("%d\n",(hex "$_")*2);'

これは、prog2(-nオプション)からのouptutの行をループし、16進数(hex "$_")から再フォーマットし、2を掛けてから10進数として出力します。

編集

stdoutバッファをクリアする必要があるかもしれません、perlでは'$ |++'でこれを行うことができます:

 prog1 | prog2 | perl -e '$|++; while(<STDIN>) { chomp; printf ("%d\n",(hex "$_")*2); }'
于 2012-12-06T14:02:18.940 に答える
1

ここに面白い可能性があります:

{ echo "iscale=16"; prog1 | prog2; } | sed 's/$/*2/' | bc

iscale=16これは最初にエコーします(bc基数16でのユーザーの入力を考慮するように指示します)。次に、各行にsed追加します。これはすべてbcを経由して、10進数に変換し、2を掛けます。*2

制限があります。プログラムprog2はすべての16進数を大文字で出力する必要があります(たとえば、でFA34はありませんfa34)。これが制限である場合は、以下を使用してください。

{ echo "iscale=16"; prog1 | prog2; } | sed 's/\(.*\)/\U\1*2/g' | bc

代わりは。

于 2012-12-06T14:29:14.567 に答える