sed または awk を使用して行をコピーし、新しい場所に挿入します。

sed または awk を使用して行をコピーし、新しい場所に挿入します。

私はこのファイルを持っています:

a
b
c
d
e
f

最初の行の前に最後の行をコピーしたいので、次のような結果を得ます。

f
a
b
c
d
e
f

sedまたはでこれを行うにはどうすればよいですかawk

答え1

そしてed

$ printf '$t0\n,p\n' | ed -s file
f
a
b
c
d
e
f

tのコマンドは、ed指定された行$(ここでは最後の行)から引数として指定された行(ここでは0最初の行の前に挿入されます)の後に行を転送/コピーします。この,pコマンドは編集バッファの内容を印刷します(w結果をファイルに書き戻すように変更します)。

答え2

純粋なsed:

sed 'H;1h;$!d;G' file.txt

すべての行は予約済みスペースに収集され、最後の行に追加されます。

  • H現在行を予約済みスペースに追加します。残念ながら、これは改行で始まるスペースを予約するため、最初の行の1h場合、予約されたスペースは前の改行なしでその行で上書きされます。
  • $!d!これが最後の行($)でなければ、dまだ印刷したくないので、その行を削除するという意味です。
  • G他の行のd処理が停止したため、最後の行に対してのみ実行されます。これで、予約済みスペース(最初から最後まで)に収集されたすべての行がコマンドを使用して現在の(最後の)行に追加され、Gすべての内容がスクリプトの最後に印刷されます。

答え3

またはsedなしでこれを行う。

tail -1 list && cat list

答え4

GNU awk:

awk 'ENDFILE { if(NR==FNR) print } NR!=FNR' infile{,}

ポータブルawk:

awk 'NR!=FNR && !f { f=1; print p } NR!=FNR; { p=$0 }' infile{,}

関連情報