以下のデータを含むファイルがLinuxにあります。
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
このファイルの最後の行を切り取り、2番目の位置に配置する必要があります。以下のようになります。
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd
以下のデータを含むファイルがLinuxにあります。
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
このファイルの最後の行を切り取り、2番目の位置に配置する必要があります。以下のようになります。
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd
回答:
この問題は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
sed '$x;1!H;1p;$!d;x;s/\n//
' <<\IN
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
IN
... 最初H
では!
ないすべての行を古くし、最初にそれをp
リントします。上の$
最後の行には、電子x
の変更が保持し、パターンスペースの前にそれがないH
最後の行に追加保存した行を取得している- -古いをd
出力からであるすべての行eletes !
ない$
最後に。
上の$
最後の行には、電子x
、再び変更スペースをs///
最初ubstitutes離れて\n
2行目に追加の余分の世話をする- -そして、多くのことをautoprints ewline文字が。
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
の行stdin
だけをp
リントしてd
から!
、$
最後の行ではないすべての行を出力から削除します。最後の行はr
自動印刷されますが、最後のコマンドが実行される唯一の行でもあります。これにより、全体がinfile
再びに出力されstdout
ます。これらすべては|
パイプを介して2番目に渡され、3番目と最後の入力行を出力sed
からd
削除して、再配置を完了するだけです。
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd
awk
-私は試したことがない。多分いつか...
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
配列のすべての行を保存してから、配列を必要な順序(1行目、最後の行(NR
)、2から2番目まで)で出力します。
ヘッド/テールとセッドの組み合わせを使用:
~$ 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行目から、それをホールドバッファーに入れ(H
)、パターンスペースから削除します(d
)。そして、それが最後の行である場合は、それを印刷し(p
)、次に保留バッファーを取得し(x
)、空の行を削除し(s/^\n//
)、それを印刷します(p
)。
sed
パーツの代わりはのようなものhead -n -1 f | tail -n +2
です。
-1
構文head
は移植可能ではありません。
awk
ソリューションを、あなたは巨大であるsed
ファンまたはおそらくあなたは書きましたかsed
?;-)