一時ファイルを使用せずに、出力の最初のN行を最後に移動します。

一時ファイルを使用せずに、出力の最初のN行を最後に移動します。

次のコマンドの出力を想像してみてください。

44444
55555
11111
22222
33333

最初のN行(上記の例の最初の2行)を取り出して最後に追加するにはどうすればよいですか?一時ファイルを使用しないでください(だからパイプを使用してください)?

11111
22222
33333
44444
55555

これはこれです| sed -n '3,5p;1,2p'(sedはコマンドの順序を気にしないので、明らかに動作しません)。

ベストアンサー1

この行を保持バッファにコピーして削除します。次に、最後の行で保持バッファの内容をパターン空間に追加します。

some command | sed '1,NUMBER{           # in this range
H                                       # append line to hold space and
1h                                      # overwrite if it's the 1st line
d                                       # then delete the line
}
$G'                                     # on last line append hold buffer content

gnu sed次のように書くことができます。

some command | sed '1,NUMBER{H;1h;d;};$G'

これはol '代替ですedr出力をsome commandテキストバッファに書き込んでから、次の行をmスキップします)。1,NUMBER$

ed -s <<IN
r ! some command
1,NUMBERm$
,p
q
IN

指摘したように、NUMBER出力が+1行未満の場合は失敗します。より安定した方法は次のとおりです(gnu sed構文)。

some command | sed '1,NUMBER{H;1h;$!d;${g;q;};};$G'

これは、最後の行()以外の範囲の行だけを削除します。$!dそれ以外の場合は、パターンスペースを保持バッファの内容()で上書きし、guitsqを使用します(現在のパターンスペースを印刷した後)。

おすすめ記事