大きなファイルの先頭と末尾に行を追加するシナリオがあります。
下図のように試してみました。
最初の行の場合:
sed -i '1i\'"$FirstLine" $Filename
最後の行の場合:
sed -i '$ a\'"$Lastline" $Filename
ただし、このコマンドの問題は、ファイルの最初の行を追加してファイル全体を繰り返すことです。最後の行の場合は、ファイル全体をもう一度見て、最後の行を追加します。ファイル容量が非常に大きく(14GB)時間がかかります。
ファイルを一度だけ読みながらファイルの先頭に1行を追加し、ファイルの最後に別の行を追加するにはどうすればよいですか?
答え1
sed -i
一時ファイルの使用は実装の詳細です。ただし、既存のコンテンツを上書きせずにデータストリームの先頭にデータを追加したい場合は、ファイルを再作成する必要がありますsed -i
。
ファイルを書き換えることができない場合は、ファイルを読み取るときにそのファイルに対する操作を検討できます。たとえば、次のようになります。
{ echo some prepended text ; cat file ; } | command
また、sedはストリーム編集用です。ファイルはストリームではありません。 edやexなど、この目的のために設計されたプログラムを使用してください。 sedオプションは-i
移植できないだけでなく、実際にファイルを削除して再生成するため、ファイルへのすべてのシンボリックリンクを切断します。これは意味がありません。
次のように単一のコマンドを使用してこれを実行できますed
。
ed -s file << 'EOF'
0a
prepend these lines
to the beginning
.
$a
append these lines
to the end
.
w
EOF
edの実装に応じてページングファイルを使用できるため、少なくとも十分な空き容量が必要です。
答え2
ディスクにファイルの完全なコピーを割り当てたくない場合は、次のようにします。
sed '
1i\
begin
$a\
end' < file 1<> file
これは、stdin / stdoutがファイルのときにsed
ブロック単位で読み書きが行われるという事実を利用します。したがって、ここで追加する最初の行がブロックサイズ(4kまたは8k程度でなければならない)より小さい場合は、読み込んでいるsed
ファイルを上書きできます。
何らかの理由で失敗するとsed
(終了、コンピュータのクラッシュなど)、ファイルの半分が処理されます。つまり、最初の行サイズの一部のデータが中間のどこかで失われることを意味します。
sed
また、これはGNU以外ではバイナリデータでは機能しないことに注意してくださいsed
(ただし、sedを使用しているので-i
GNU sedを使用しています)。
答え3
以下はいくつかのオプションです(すべてのファイルの新しいコピーを作成するので、十分なスペースがあることを確認してください)。
シンプルなエコ/猫
echo "first" > new_file; cat $File >> new_file; \ echo "last" >> new_file;
あざ/あざなど
gawk 'BEGIN{print "first\n"}{print}END{print "last\n"}' $File > NewFile
awk
そしてそれに対応するのは、ファイルを1行ずつ読みます。このBEGIN{}
ブロックは、最初の行の前とEND{}
最後の行の後で実行されます。したがって、上記のコマンドはを意味しますprint "first" at the beginning, then print every line in the file and print "last" at the end
。真珠
perl -ne 'BEGIN{print "first\n"} print;END{print "last\n"}' $File > NewFile
これは本質的に上記のPerlで書かれたgawkと同じです。
答え4
ExモードでVimを使用できます。
ex -sc '1i|ALFA' -c '$a|BRAVO' -cx file
1
最初の行を選択i
テキストと改行の挿入$
最後の行を選択a
テキストと改行を追加x
保存して閉じる