2013-02-05 16 views
12

Używam systemów importowania opartych na rozdzielanych plikach tekstowych. Używane pliki mogą czasami mieć prawie 2 GB i muszę sprawdzić niektóre wiersze z tego pliku. Więc chcę wiedzieć, w jaki sposób mogę wydrukować (na innym pliku lub tylko na ekranie) linie o określonej wartości? Na przykład. numer linii 1010123, 1002451, 994123 itp., dokładnie tak, jak w pliku źródłowym?Jak zdobyć określone linie z dużego pliku tekstowego w Uniksie?

Odpowiedz

27

Aby wydrukować linii N, zastosowanie:

sed 'Nq;d' file 

Aby wydrukować wiele wierszy (zakładając, że są one w kolejność rosnąca) np 994123, 1002451, 1010123.

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

q po ostatni numer linia mówi sed rzucić gdy osiągnie linię 1010123th, zamiast tracić czas przez zapętlenie nad pozostałymi liniami, które nie są zainteresowane w tym jest dlaczego jest wydajny w przypadku dużych plików.

+1

Dzięki za milion. To działało jak zaklęcie :) – BogdanM

3

Można to zrobić za pomocą wielu narzędzi Unix, na przykład z 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

Jak 'sed' /' awk' wykonywać na bardzo dużych plików, takich jak te, o których wspomniał w swoim pytaniu (~ 2GB)? –

+0

Numery linii nie są sekwencyjne. Nie pierwszy Nth lub ostatni Nth. To tylko linie z błędami. Mam numery linii w tabeli i po prostu chcę wypisać tylko określone numery linii. – BogdanM

+0

@BogdanM zobacz drugi przykład 'awk' dla tego (dogbane odpowiedzi pokazuje jak z sed) Myślałem, że zakresy drukowania również będą dla ciebie przydatne. –

0

W python:

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

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

Jeśli chciał można zmodyfikować ten skrypt do pracy z argumentów (jak getline.py 1234)

+0

Bardziej wydajnie byłoby wyjść po wydaniu 'outputFile.write (linetext)', ponieważ pytanie jest oznaczone tylko 'unix' więc nie jestem pewien, czy OP ma' Python' dostępny. –

+0

Nie mogę powiedzieć, czy jest dostępny Python, czy nie (nie powiedział, który język, którego chce, jest rozwiązaniem napisanym). A z powodu rzucenia na linię: Tak, można to zrobić, ale mój scenariusz nie jest skryptem "jest gotowy do użycia, po prostu skopiuj i wklej", to tylko podpowiedź, jak można to zrobić – chill0r

Powiązane problemy