
2 つの数値を割る簡単な bash 関数があります。
echo "750/12.5" | bc
からの出力を取得しbc
て追加し/24
、その結果を の別のインスタンスにパイプしたいと思いますbc
。
何かのようなもの:
echo "750/12.5" | bc | echo $1 + "/24" | bc
$1
パイプされた結果はどこにありますか。
echo "750/12.5/24" | bc
PS : 私の質問は、パイプの結果にテキストを追加することに関するものであることに気づきました。
答え1
私はこれを使用してsed
、行末を置き換えることでこれを実現しました:
echo "my text" | sed 's/$/ more text/'
戻り値:
my text more text
あなたの例:
echo "750/12.5" | bc | sed 's/$/\/24/' | bc
答え2
代替アプローチ:
TL;DR: cat
stdin( -
) を引数として連結するために使用します。連結されたストリームは改行で区切られることに注意してください。不要な場合は削除してください。
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
しかし、私は「bash append 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 つのインスタンスには 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