大容量ファイルの先頭と末尾に行を追加する

大容量ファイルの先頭と末尾に行を追加する

大きなファイルの先頭と末尾に行を追加するシナリオがあります。

下図のように試してみました。

  • 最初の行の場合:

    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を使用しているので-iGNU 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. 1最初の行を選択

  2. iテキストと改行の挿入

  3. $最後の行を選択

  4. aテキストと改行を追加

  5. x保存して閉じる

関連情報