2013-02-05 8 views
12

私は区切られたテキストファイルに基づいてシステムをインポートします。使用されるファイルは、時には2Gb程度になることがあり、そのファイルからいくつかの行をチェックする必要があります。 私はどのように特定の値の行を出力することができますか?例えば。行番号1010123,1002451,994123など、ソースファイルとまったく同じですか?UNIXの巨大なテキストファイルから特定の行を得るには?

答えて

27

はラインNを印刷するには、使用:

sed 'Nq;d' file 

は、複数行を印刷するには(彼らはしていると仮定昇順) 994123、1002451、1010123:

sed '994123p;1002451p;1010123q;d' file 

q最後の行番号ではなく、私たちが興味を持っていない残りの行をループして時間を無駄に、それは1010123thラインに達したときに終了することsedに指示した後であること。大容量ファイルで効率的な理由Pythonで

+1

ありがとうございます。それは魅力的に働いた:) – BogdanM

3

あなたはawkで、たとえば、多くのUnixツールでこれを行うことができます。

# print first 5 lines with awk 
awk 'NR>=1&&NR<=5{print}NR>=6{exit}' file 

# print selection of lines 
awk 'NR==994123||NR==1002451||NR==1010123{print}NR>1010123{exit}' file 
+0

がどのように 'sed' /' awk'のような非常に大きなファイルを上行ってない(getline.py 1234のような)の引数で動作するようにそのスクリプトを修正することができたい場合彼が彼の質問で言及したもの(〜2GB)? –

+0

行番号は連続していません。最初のN番目または最後のN番目ではありません。それらはエラーのある行だけです。私はテーブルの行番号を持っているだけで、特定の行番号を出力したいだけです。 – BogdanM

+0

@BogdanMこれについては2番目の 'awk'の例を参照してください(ドッグベットの答えはどのようにsedで表示されるのですか)私は印刷範囲もあなたにとって有益だと思っていました。 –

0

readThisFile = open('YOURFILE') 
outputFile = open('OUTPUT', w) 

for actualline, linetext in enumerate(readThisFile): 
    if actualline == WANTEDLINE 
     outputFile.write(linetext) 
    else: 
     pass 

あなたは

+0

質問は 'unix'だけタグ付けされているので、' outputFile.write(linetext) 'が出力された後に終了する方が効率的です。OPに' Python'があります。 –

+0

Pythonが利用できるかどうかは言えません(彼は、どの言語を書いたのか解説しませんでした)。 そして、行を止めるために:うん、することができますが、私のスクリプトは "それを使用する準備ができて、ちょうどそれをコピー&ペースト"スクリプトではありません、それはどのように行うことができるヒントです – chill0r

関連する問題