$rmv
.という巨大なテキストファイルの最初の行を削除したいと思います$filename
。このテキストファイルは大きすぎて、私のハードドライブに2つのコピーを保存できません。
以下は、次の空のファイルを残します$filename
。
tail -n +$rmv "$filename" > "$filename"
$filename
合計を保存するための空き容量が不足しているため、以下を実行できません$filename.tmp
。
tail -n +$rmv "$filename" > "$filename.tmp" && mv "$filename.tmp" "$filename"
重要な場合は、Mac OS X El Capitanを使用しています。
答え1
あなたが持っている場合perl
:
{
tail -n +"$rmi"
perl -e 'truncate STDOUT, tell STDOUT'
} <file 1<>file
この方法ではファイルのバックアップがないため、破損が発生するとデータが失われる可能性があります。
答え2
ed
一時ファイルは使用していないようです。
ed bigfile <<ED_SCRIPT
1,${rmv}d
w
q
ED_SCRIPT
答え3
答え4
あなたのテキストファイルはxMBで、2 * xMBはありませんが、ファイルを圧縮するのに十分なスペースがないと思いますか?テキストファイルは通常、元のサイズの1/10に圧縮されます。
($total-$rmv) 行を収容するのに十分なスペースがありません。しかし、圧縮するとどうなりますか?tail -n +$rmv "$filename" | gzip > "$filename.tmp" && zcat "$filename.tmp" > "$filename"
これを抽象的な知的問題と考えてファイルを塊に切り、メモリや使用可能なディスク領域に合わせてサイズを変更し、最後の塊から始めて元のファイルを切り取ります。また、ファイルを所定の場所に圧縮するためにトリックを使用することもできますdd conv=notrunc
。
しかし実際に私は
($total-$rmv)行を(のみ)保持するのに十分なディスクを持つサーバーにネットワーク経由でファイルをコピーし、正しい行が得られたことを確認し、元のファイルを削除して再コピーしました。
明らかに必要なので、ディスクを追加します。