大きなテキストファイルの最初のn行を削除する


63

2GB SQLダンプの最初の42行を削除する必要があります。

私は次を使用して最初の行を表示できることを知っています:

head -n 44 dump.sql

しかし、とにかくそれらを編集または削除することはできますか?

回答:


91

43日以降の行を表示したいだけなら、使用できます

tail -n +43 dump.sql

+記号は重要である-それは、なしでtail印刷される最後の代わりに43行を。または、「sed」を使用

sed 1,42d dump.sql

元のファイルから最初の42行を本当に削除したい場合は、sedに-iオプションを付けてその場で変更を加えることができます。

sed -i 1,42d dump.sql

素晴らしい答え、の素晴らしい使用法tail。私はあなたの答えから学ぶことが何か新しいことを何度も見つけました。ありがとう。
souravc 14年

1
ああ男の尾-n +43はゲームチェンジャーです!私は同じ効果のためにsedの厄介な呼び出しを使用しています。
pfctdayelise

4
デバイスにスペースが残っていない場合はどうなりますか?さらに多くのギガバイトを消費するsed -i 1,50000000d 17GigFile一時ファイルsedXYZを作成します。一時ファイルなしのアプローチはありますか?
juanmf

質問で言及されているように、tail -n +43との違いは何head -n 44ですか?
ハシム

あなたは、GUIツール(私はマウスパッドを使用してそれをやったが、興味のあるファイルは、「のみ」〜700メガバイトだったでこれを行うしようとする可能性があり@juanmfしかし...、ロードするファイルのためにしばらくかかります。
ディガー

18

これが最も簡単なようです:

sed '1,42d' test.sql > test2.sql

test.sqlから行1-42を削除し、test2.sqlとして保存します


9
元のファイルを保持する必要がない場合は、短い方がsed -i '1,42d' test.sqlになります。
サディ


3

ExモードでVimを使用できます。

ex -s -c '1d42|x' dump.sql
  1. 1 最初の行に移動する

  2. 42 42行を選択

  3. d 削除する

  4. x 保存して閉じます


1
一時ファイルを作成しますか?デバイスに残っているスペースがファイルサイズより少ないときにこれを行うことは可能ですか?
juanmf

2
@juanmfこれらすべてのソリューションには一時ファイルが必要です。一時ファイルを使用せずにファイルの末尾からデータを削除することのみが可能です。
PerlDuck

0

申し訳ありませんが、今すぐ実際のコードを提供することはできません。ただし、次の線に沿って何かを見てみてください

tail -n arcv(`wc -l`) -44

これが行うべきことは(適切にフォーマットされたら)、ファイル内の行数をカウント(wc -l)し、そこから44を減算(-44)してから、ファイルの45行目からすべてを印刷します。

これがお役に立てば幸いです。


これは、呼び出し、かなり最適ではないwc -lのに対し、あなたは、それを2回処理し、ファイル上sedまたはtail一度だけ、それを処理します。
yo

0

これを試して、

head -n 42 dump.sql > tmp; cat dump.sql | grep -vxf tmp > dump.sql.new; rm tmp

または、

a=$(cat dump.sql| wc -l); tail -n "$((a-42))" dump.sql > dump.sql.new

0

これを追加するだけです。Macを使用している場合は、バックアップ拡張機能を追加する必要があります。この投稿からの回答。

sed -i '.bak' 1,42d dump.sql

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.