ファイルの最後の行を同じファイルの2行目に移動する必要があります。

ファイルの最後の行を同じファイルの2行目に移動する必要があります。

Linuxには、次のデータを含む「test」ファイルがあります。

aaaaaa
bbbbbb
cccccc
dddddd
eeeeee

ファイルの最後の行をカットして2番目の場所に配置する必要があります。以下のようにする必要があります。

aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

答え1

edこの問題は基本的にストリームプロセッサではなくスクリプト可能なテキストエディタなので、実際にそれを使用して解決するのが最も簡単です。たとえばed

# Create test file
~> printf "%s\n" aaaaaa bbbbbb cccccc dddddd eeeeee >test.txt
~> cat test.txt
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee

# Use ed to open the file, move the last line after the first, save, and quit
~> printf "%s\n" '$m1' wq | ed test.txt
35
35
~> cat test.txt
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

答え2

バッファ方式の維持:

sed '$x;1!H;1p;$!d;x;s/\n//
' <<\IN
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
IN

...最初の行でHはなくすべての行が変更され、印刷される最初の行になります。最後の行では、ホールドとパターンスペースを変更します。!p$x今後これはH前の操作(保存された行を最後の行に追加)し、出力から最後dの行以外の!すべての行を削除します$

$最後の行では、x空白をもう一度変更してs///最初の\newline文字(2行目に追加された追加を処理します)を置き換え、自動的にバッチを印刷します。

出力:

aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

固定バッファを使用せずに:

cat <<\IN >infile
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
IN

...例を実際のファイルに保存...

sed '1p;$!d;r infile' <infile | sed '3d;$d'

これは最初の行だけを印刷する最初の行にリダイレクトされ、出力から最後の行以外のすべての行を<infile削除sedします。最後の行は自動的に印刷されますが、これは最終コマンドを実行する唯一の行でもあります。stdinpd!$rinfile 再び到着するstdout。すべてが|2番目のパイプに接続され、sed出力dから3番目と最後の入力行を削除すると、再配置が完了します。

出力:

aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

答え3

awkを使用する簡単な方法:

~$ awk '{a[NR]=$0}END{print a[1];print a[NR];for(i=2;i<NR;i++){print a[i]}}' f
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

各行を配列に保存し、目的のa順序(最初の行、最後の行(NR)、および2から2番目の行から最後の行まで)に配列を印刷します。

head/tail と sed の組合せを使用して下さい:

~$ head -1 f;tail -1 f;sed '1d;$d' f
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

最初と最後の行を印刷してから、sedを使用して最初と最後の行を削除します。


sedのみを使用すると、このコマンドのみを見つけることができます。より良い方法があると確信しています。

~$ sed '${p;x;s/^\n//;p};2,${H;d}' f
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

最初の行で印刷します(デフォルト)。 2行目から保持バッファ()
に入り、パターン空間()から削除されます。最後の行であれば、印刷して()、保持バッファを取得して()、空の行を削除して()印刷します()。Hdpxs/^\n//p

答え4

パールの使用:

perl -e 'my @lines = <>; print for @lines[0, $#lines, 1..$#lines-1]' file

awkを使う:

$ awk '
    {lines[NR]=$0}
    END{
        print lines[1], lines[NR];
        for (i=2; i<NR; i++) {print lines[i]}
    }
' OFS=$'\n' file

出力

aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

関連情報