他のプログラムの出力を要約する小さなAWKスクリプトがあります。コマンド自体の前にその要約を印刷しようとするのに良い方法がありません。私の素朴な最初の解決策は、コマンドを2回実行することでした。一度は要約情報を取得し、一度は要約が追加された出力全体を印刷しました。これで、tee
プログラム出力を一度読み、使用して移動head
するtail
ことに慣れました。これは以前のバージョンより約3倍速いです。
現在のバージョンは次のとおりです。
program | awk ... | tee >(head -n -3) >(tail -n -3) > /dev/null
希望の出力を提供しますが、私が確信するほどエレガントで高速ではありません。少なくとも/dev/nullにリダイレクトする必要がない方法があると思いますが、これを達成するための配列がわかりません。
同様の質問にいくつかの回答を見たことed
があり、同じことをしたいのですが、コマンドをパイプで接続しようとするとうまくed
いきません。具体的には私の考えでは
echo -e "$-2,$m0\n,p\nQ" | ed <(program | awk ...)
コマンドを実行するとうまくいくed
ため、うまくいくはずですが、問題を「$-2」アドレスに絞り込みました。パイピングするときはうまくいかないようですが、ed
自分で実行するとうまくいきます。私はこの部分をGNUバージョン1.9と1.16でテストしました。どちらの場合も、そのオプションを使用すると、-v
「無効なコマンドサフィックス」エラーが発生します。走っても
echo "$-2,$p" | ed -v filename
このエラーが発生するため、プロセス交換の問題ではありません。私は明らかにedを使用してから1時間も経たず、edでバグを見つけたと疑ったので、私が何が間違っているのかここに尋ねたいと思いました。私はまたedに関連していないすべての解決策で開いています。これが有望なアプローチのように見えると思います。
役に立つ場合、「プログラム」はqstat
AWKがユーザーが実行、待機、終了したジョブの数を計算し、最後に合計を印刷することです。私が望む機能を組み込んだqstatオプションがあるかもしれませんが、まだマニュアルで見つからなかったので、これも便利な答えになります!私のコマンドed
にどのような問題があるのか本当に知りたいです。
答え1
あなたは実際にそれを偶然見つけました。シェル、エディタではありません。これ
echo -e "$-2,$m0\n,p\nQ"
二重引用符で囲まれているため、パラメータ拡張を意味します$-
。$m0
走ってecho "$-"
直接確認してみてくださいecho "$m0"
。シェルが拡張しないように単一引用符で囲む必要があります。
これで問題を解決しているので、私たちも同じです。好むprintf
echo
。後者は実装全体にわたって一貫性のない動作を示しますが、前者は健全です。これを行う必要があります:
printf '%s\n' '$-2,$m0' ',p' 'Q' | ed -s <(program | awk ...)
-s
edに「診断、バイト数、 '!'表示抑制」オプションが追加されました。これは純粋に装飾的です。
サンプルの実行(プロセスの置き換えをシミュレートするためにcatを無駄に使用します):
$ cat input
ATOM 126 CD GLN A 449 -2.853 11.592 119.709 1.00 17.95 C
ATOM 127 OE1 GLN A 449 -4.056 11.297 119.695 1.00 20.83 O
ATOM 128 NE2 GLN A 449 -1.948 10.876 120.359 1.00 14.98 N
HETATM 129 N MSE A 450 -4.523 16.830 119.280 1.00 14.88 N
HETATM 130 CA MSE A 450 -5.537 17.804 118.911 1.00 15.65 C
$ printf '%s\n' '$-2,$m0' ',p' 'Q' | ed -s <(cat input)
ATOM 128 NE2 GLN A 449 -1.948 10.876 120.359 1.00 14.98 N
HETATM 129 N MSE A 450 -4.523 16.830 119.280 1.00 14.88 N
HETATM 130 CA MSE A 450 -5.537 17.804 118.911 1.00 15.65 C
ATOM 126 CD GLN A 449 -2.853 11.592 119.709 1.00 17.95 C
ATOM 127 OE1 GLN A 449 -4.056 11.297 119.695 1.00 20.83 O