2013-02-05 5 views
12

Ich verwende importierende Systeme basierend auf Textdateien mit Trennzeichen. Die verwendeten Dateien können manchmal fast 2 GB groß sein und ich muss einige Zeilen aus dieser Datei überprüfen. Also ich möchte wissen, wie kann ich (in einer anderen Datei oder nur auf dem Bildschirm) die Zeilen von bestimmten Wert ausgeben? Z.B. Zeilennummer 1010123, 1002451, 994123 usw. genau so wie in der Quelldatei?Wie bekomme ich bestimmte Zeilen aus einer riesigen Textdatei in Unix?

Antwort

27

Um Linie N zu drucken:

sed 'Nq;d' file 

mehrere Zeilen drucken (vorausgesetzt, sie sind in aufsteigende Reihenfolge) z 994.123, 1.002.451, 1.010.123.

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

Die q, nachdem die letzte Zeilennummer sed sagt zu beenden, wenn es die 1010123th Linie erreicht, statt Zeit zu verschwenden, um über die verbleibenden Linien Looping, dass wir nicht interessiert sind Das ist Warum ist es bei großen Dateien effizient?

+1

Tausend Dank. Es funktionierte wie ein Charme :) – BogdanM

3

Sie können dies tun, mit vielen Unix-Tools, zum Beispiel mit awk:

# 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

Wie 'sed' /' awk' führen auf sehr große Dateien wie diejenigen, die er in seiner Frage erwähnt (~ 2 GB)? –

+0

Die Zeilennummern sind nicht fortlaufend. Nicht erste Nth oder letzte Nth. Sie sind nur Linien mit Fehlern. Ich habe Zeilennummern in einer Tabelle und möchte nur bestimmte Zeilennummern ausgeben. – BogdanM

+0

@BogdanM siehe das zweite 'awk' Beispiel dafür (Dogbane Antworten zeigt, wie mit sed) Ich dachte, Druckbereiche wären auch für Sie nützlich. –

0

In Python:

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

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

Wenn Sie wollte das Skript ändern können, mit Argumenten zu arbeiten (wie getline.py 1234)

+0

Es wäre effizienter zu beenden, nachdem 'outputFile.write (linetext)' auch gedruckt wird, da die Frage nur 'unix' markiert ist, so dass ich unsicher bin, ob das OP 'Python' zur Verfügung hat. –

+0

Ich kann nicht sagen, ob Python verfügbar ist oder nicht (er hat nicht gesagt, in welcher Sprache er die Lösung geschrieben haben möchte). Und wegen der Kündigung an der Linie: Ja, das ist möglich, aber mein Skript ist kein "es ist bereit zu verwenden, nur kopieren und einfügen" -Skript, es ist nur ein Hinweis, wie es gemacht werden kann – chill0r

Verwandte Themen