パイプに取り付けて通過しますか?

パイプに取り付けて通過しますか?

2つの数字を分割する単純なbash関数があります。

echo "750/12.5" | bc

出力をbc取得し、/24結果をbc

それは次のとおりです。

echo "750/12.5" | bc | echo $1 + "/24" | bc

$1パイプラインの結果はどこにありますか?

PS:echo "750/12.5/24" | bc質問で私ができることは、パイプラインの結果にテキストを追加することです。

答え1

sedこれを達成するために、行末を使用して交換しました。

echo "my text" | sed 's/$/ more text/'

返品:

my text more text

あなたの例:

echo "750/12.5" | bc | sed 's/$/\/24/' | bc

答え2

代替方法:

重要な要約:catstdin(-)を引数に連結することです。リンクされたストリームを改行で区切ります。必要でない場合は削除してください。

残念ながら、このアプローチは特定のユースケースでは少し面倒です。bc途中で改行があると、式が失敗するためです。

$ echo "750/12.5" | bc | cat - <(echo "/24") | bc
60
(standard_in) 2: parse error

元の結果から改行文字を削除することでこの問題を解決できますbc

$ echo "750/12.5" | bc | tr -d '\n' | cat - <(echo "/24") | bc
2

しかし、「bashappend to Pipe」を検索してこの問題を発見しました。する接続の間に改行が必要です。したがって、同じ理由を持つ人には次のものを使用してください| cat - <(...)

$ echo foo | cat - <(echo bar)
foo
bar
$ echo foo | cat - <(echo bar) | sort | cat - <(echo last_line)
bar
foo
last_line
$ echo foo | cat - <(echo bar) | sort | cat <(echo header) - <(echo last_line)
header
bar
foo
last_line

答え3

最も簡単なオプションはパイプストリームに追加されます。

$ echo "750/12.5" | { bc; echo "/24"; }
60
/24

ただし、trを使用する必要がないように、予期しない改行文字があります。

$ echo "750/12.5" | { bc | tr -d '\n' ; echo "/24"; }
60/24

または、コマンド拡張によって末尾の改行が削除されることを検討してください。

$ printf '%s' $( echo "750/12.5" | bc ); echo "/24"
60/24

しかし、おそらく正しいアプローチは次のとおりです。

$ echo "$(echo "750/12.5" | bc )/24"
60/24

bcで使用するには、次のように書くことができます。

$ bc <<<"$(bc <<<"750/12.5")/24"
2

合理的な浮動小数点精度を得るには、次のようにする必要があります。

$ bc <<<"scale=10;$(bc <<<"scale=5;750/12.5")/24"
2.5000000000

bcインスタンスが2つあるため、2つのスケールが必要です。

もちろん、bcインスタンスには1つのスケールしか必要ありません。

$ bc <<<"scale=5;750/12.5/24"

実際、あなたが考えなければならないのは文字列です:

$ a=$(echo "750/12.5")        # capture first string.
$ echo "$a/24" | bc           # extend the string
2

スケールに関する上記の説明は、ここでも依然として有効である。

答え4

awk以下を使用して、パイプに何でも挿入/追加できます。

$ date | awk 'BEGIN{print "prefix line"} {print}  END{print "suffix  line"}'
prefix line
Mo 21. Aug 15:24:30 CEST 2023
suffix  line

どこ

  • date- 入力パイプです(例:現在の日付)。
  • BEGIN{print "prefix line"}- このブロックはメインの前に出力を挿入します。
  • {print}- 入力パイプの内容を印刷します。必要に応じて、ここでいくつかの処理を実行できます。
  • END{print "suffix line"} - メインの後ろに出力を追加します。

1行で同じ操作を実行するには、次を使用しますprintf

$ date | awk 'BEGIN{printf("prefix line >> ")} {printf($0)}  END{printf(" << suffix  line")}'
prefix line >> Mo 21. Aug 15:32:08 CEST 2023 << suffix  line/upload/sc505enb/tmp>

$ echo "750/12.5" | bc | awk '{printf($0)}  END{printf("/24\n")}'
60/24

関連情報