edを使用してパイプの最後の3行を出力の上部に移動するにはどうすればよいですか?

edを使用してパイプの最後の3行を出力の上部に移動するにはどうすればよいですか?

他のプログラムの出力を要約する小さな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に関連していないすべての解決策で開いています。これが有望なアプローチのように見えると思います。

役に立つ場合、「プログラム」はqstatAWKがユーザーが実行、待機、終了したジョブの数を計算し、最後に合計を印刷することです。私が望む機能を組み込んだqstatオプションがあるかもしれませんが、まだマニュアルで見つからなかったので、これも便利な答えになります!私のコマンドedにどのような問題があるのか​​本当に知りたいです。

答え1

あなたは実際にそれを偶然見つけました。シェル、エディタではありません。これ

echo -e "$-2,$m0\n,p\nQ"

二重引用符で囲まれているため、パラメータ拡張を意味します$-$m0走ってecho "$-"直接確認してみてくださいecho "$m0"。シェルが拡張しないように単一引用符で囲む必要があります。

これで問題を解決しているので、私たちも同じです。好むprintfecho。後者は実装全体にわたって一貫性のない動作を示しますが、前者は健全です。これを行う必要があります:

printf '%s\n' '$-2,$m0' ',p' 'Q' | ed -s <(program | awk ...)

-sedに「診断、バイト数、 '!'表示抑制」オプションが追加されました。これは純粋に装飾的です。

サンプルの実行(プロセスの置き換えをシミュレートするために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

関連情報