私はこのファイルを持っています:
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{,}