VIMで巨大な(〜2GB)ファイルを開こうとしましたが、窒息しました。実際にファイルを編集する必要はありません。効率的にジャンプしてください。
VIMで非常に大きなファイルを操作するにはどうすればよいですか?
:set binary
最初であれば大丈夫です...
VIMで巨大な(〜2GB)ファイルを開こうとしましたが、窒息しました。実際にファイルを編集する必要はありません。効率的にジャンプしてください。
VIMで非常に大きなファイルを操作するにはどうすればよいですか?
:set binary
最初であれば大丈夫です...
回答:
今日編集する12GBのファイルがありました。vim LargeFileプラグインが機能しませんでした。それでも私のメモリをすべて使い果たしてエラーメッセージが表示されました:-(
ファイルを分割し、パーツを編集してから、再結合します。ただし、2倍のディスク容量が必要です。
編集したい行を囲む何かのGrep:
grep -n 'something' HUGEFILE | head -n 1
その範囲のファイルを抽出します。編集したい行が4行目と5行目にあるとします。次に、次のようにします。
sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART
-n
オプションは、すべてのものを印刷するのsedのデフォルトの動作を抑制するために必要とされます4,5p
4行目と5行目を出力します5q
行5の処理後にsedを中止します SMALLPART
お気に入りのエディターを使用して編集します。
ファイルを結合します。
(head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new
HUGEFILE.new
これで編集したファイルになり、元のを削除できますHUGEFILE
。
これは何年にもわたって繰り返し発生する問題でした。(数字は変わり続けますが、概念は同じです:メモリよりも大きいファイルを表示または編集するにはどうすればよいですか?)
明らかに、more
またはless
単にファイルを読み取るための優れたアプローチです- スクロールや検索のためのキーバインドなどless
も提供していますvi
。
A Freshmeatのは「大きなファイル」の検索は、2人の編集者は特に、あなたのニーズに適していることを示唆しています。
1つは次のようになります:lfhex ...(Qtに依存する)大きなファイルの16進エディター。これは明らかに、GUIを使用する必要があります。
別のものはコンソールの使用に適しているようです:hed ...と同様のvim
インターフェース(ex
モードを含む?)があると主張しています。
Linux / UNIXで他のエディタを使用して、全体をメモリに読み込まずにファイルをページスルーできることは確かにあります。しかし、私は彼らの名前を思い出せません。私はこの応答を「wiki」エントリにして、他の人にそのような編集者へのリンクを追加するように促しています。(はい、私が使用して問題を回避する方法に精通していますsplit
とcat
、それを省略し、このようなアプローチが伴うことを私たちに時間/待機時間とディスクスペースのオーバーヘッドを保存することができ、特にコンソール/呪いの編集者が、私は編集者と思っています) 。
view
(試して時間を計っただけです)。確かに、それはすぐにできるわけではありませんが、機能します。
私は、Florianの回答に基づいて、nano(私のお気に入りのエディター)を使用する小さなスクリプトを書きました。
#!/bin/sh
if [ "$#" -ne 3 ]; then
echo "Usage: $0 hugeFilePath startLine endLine" >&2
exit 1
fi
sed -n -e $2','$3'p' -e $3'q' $1 > hfnano_temporary_file
nano hfnano_temporary_file
(head -n `expr $2 - 1` $1; cat hfnano_temporary_file; sed -e '1,'$3'd' $1) > hfnano_temporary_file2
cat hfnano_temporary_file2 > $1
rm hfnano_temporary_file hfnano_temporary_file2
次のように使用します。
sh hfnano yourHugeFile 3 8
その例では、nanoは3行目から8行目までを開き、それらを編集できます。保存して終了すると、hugefile内のこれらの行は保存された行で自動的に上書きされます。
私も同じ問題を抱えていましたが、300GBのmysqlダンプであり、を削除してDROP
に変更CREATE TABLE
したかったため、のCREATE TABLE IF NOT EXISTS
2回の呼び出しを実行したくありませんでしたsed
。これらの変更でファイルを複製するために、この簡単なRubyスクリプトを書きました。
#!/usr/bin/env ruby
matchers={
%q/^CREATE TABLE `foo`/ => %q/CREATE TABLE IF NOT EXISTS `foo`/,
%q/^DROP TABLE IF EXISTS `foo`;.*$/ => "-- DROP TABLE IF EXISTS `foo`;"
}
matchers.each_pair { |m,r|
STDERR.puts "%s: %s" % [ m, r ]
}
STDIN.each { |line|
#STDERR.puts "line=#{line}"
line.chomp!
unless matchers.length == 0
matchers.each_pair { |m,r|
re=/#{m}/
next if line[re].nil?
line.sub!(re,r)
STDERR.puts "Matched: #{m} -> #{r}"
matchers.delete(m)
break
}
end
puts line
}
のように呼び出されます
./mreplace.rb < foo.sql > foo_two.sql
chmod +x mreplace.rb
最初に必要とするのでそれを実行するために、あなたはまたちょうどできますruby mreplace.rb ..
巨大なワンライナーの場合(から1
までの文字を印刷します99
):
cut -c 1-99 filename
古いスレッド。しかし、それでも(しゃれ:))。
$less filename
編集せずに見回すだけの場合、効率が悪くなります。これは、巨大なログファイルを調べる場合に当てはまります。
viのような少ない作業で検索
最良の部分は、ほとんどのディストリビューションでデフォルトで利用可能です。したがって、本番環境でも問題にはなりません。
これは古いですが、nano、vim、gvimを使用してください