2012-03-02 15 views
30

Mam dane w niektórych plikach tekstowych, które powiedzmy 10000 wierszy i 2 kolumny. Wiem, że mogę go łatwo wykreślić przez plot "filename.txt" using 1:2 with lines. To, czego chcę, to jednak tylko kreślenie, powiedzmy, wierszy od 1000 do 2000 lub jakiejkolwiek innej rozsądnej selekcji. Czy można to łatwo zrobić? Z góry bardzo dziękuję.Gnuplot wykreśla dane z pliku do pewnego wiersza

+0

być może to pomoże ci też: http://stackoverflow.com/questions/6564561/gnuplot-conditional-plotting-plot-col-acol-b-if-col-cx –

Odpowiedz

26

Prostsze:

plot "<(sed -n '1000,2000p' filename.txt)" using 1:2 with lines 
+1

Czy jest coś fajnego w Internecie, gdzie mogę się nauczyć tego rodzaju małych niesamowite sztuczki. Dzięki za odpowiedź btw. – YBE

+0

@YBE Proponuję [tę stronę] (http://t16web.lanl.gov/Kawano/gnuplot/index-e.html). – kev

+0

@kev uszkodzony link –

58

Wydaje się, że "every" command w gnuplot jest to, czego szukasz:

plot "filename.txt" every ::1000::2000 using 1:2 with lines 

Alternatywnie, wstępnie proces plik, aby wybrać wiersze, w którym jesteś zainteresowany. Na przykład za pomocą awk:

awk "NR>=1000 && NR<=2000" filename.txt > processed.txt 

Następnie użyj wynikowy „processed.txt” w istniejącym gnuplot poleceń/skryptu.

+0

Jeśli jesteś na linux lub mac osx, powinieneś już mieć awk (jest to część standardowego zestawu narzędzi * nix, np. sed i grep). Zacznę od uruchomienia powyższego polecenia jako etapu wstępnego przetwarzania (przed uruchomieniem gnuplot), który utworzy nowy plik danych "przetworzony.txt", pozostawiając istniejący plik bez szwanku. Powinieneś wtedy użyć "processed.txt" zamiast "filename.txt" w swoich poleceniach kreślenia. Podręcznik dla awk można znaleźć tutaj: http://www.gnu.org/software/gawk/manual/gawk.html –

+5

+1 dla natywnego rozwiązania gnuplot – Pankrates

0

Polecam kilka narzędzi wiersza poleceń jak sed, grep lub bash. W przykładzie

head -n 2000 ./file.data > temp.data 

i

tail -n 1000 temp.data > temp2.data 

może działać. Ale nie testowałem, jeśli takie duże liczby działają z głową i ogonem.

6

Prawdopodobnie można wyciąć polegania na narzędzie zewnętrznego (jeśli system nie mają je zainstalowane na przykład) za pomocą pseudo-kolumnę 0.

widzieć help plot datafile using pseudocolumn

Spróbuj czegoś takiego:

LINEMIN=1000 
LINEMAX=2000 

#create a function that accepts linenumber as first arg 
#an returns second arg if linenumber in the given range. 
InRange(x,y)=((x>=LINEMIN) ? ((x<=LINEMAX) ? y:1/0) : 1/0) 

plot "filename.txt" using (InRange($0,$1)):2 with lines 

(testowane na Gnuplot 4.4.2, Linux)

1

Gnuplot ignoruje wartości Nan. Działa to dla mnie dla określonego zakresu współrzędnej x. Nie wiem, jak określić zakres wierszy.

cutoff(c1,c2,xmin,xmax) = (c1>=xmin)*(c1<=xmax) ? c2 : NaN 
plot "data.txt" u 1:(cutoff(($1),($2),1000,2000)) 
Powiązane problemy