2011-06-27 16 views
15

Chciałbym uzyskać poradę/pomoc w zakresie dzielenia dużego pliku (miliony wierszy lub linii).jak dokonać podzbioru pliku - wybierz liczbę wierszy lub kolumn

Na przykład

(1) Mam duży plik (miliony wierszy, tabulatorami). Chcę podzbiór tego pliku z tylko wierszami od 10000 do 100000.

(2) Mam duży plik (miliony kolumn, rozdzielane tabulatorami). Chcę podzbiór tego pliku tylko z kolumnami od 10000 do 100000.

Wiem, że istnieją narzędzia takie jak głowa, ogon, cięcie, dzielenie i awk lub sed. Mogę ich użyć do zrobienia prostego podzbioru. Ale nie wiem, jak wykonać tę pracę.

Czy możesz podać jakąkolwiek radę? Z góry dziękuję.

Odpowiedz

22

filtrowania wierszy jest łatwe, na przykład z AWK:

cat largefile | awk 'NR >= 10000 && NR <= 100000 { print }' 

filtrowania kolumny jest łatwiejsze z Cięte:

cat largefile | cut -d '\t' -f 10000-100000 

Jak wspomniano Rahul Dravid, cat nie jest koniecznością tutaj, i jak Zsolt Botykai dodał, że możesz poprawić wydajność, używając:

awk 'NR > 100000 { exit } NR >= 10000 && NR <= 100000' largefile 
cut -d '\t' -f 10000-100000 largefile 
+5

+1 to najprostsza odpowiedź mogłem kiedykolwiek pomyśleć of.But kota nie jest wymagane here.we można to zrobić bez cat.'awk 'NR> = 10000 && NR <= 100000 {print}' largefile' i 'cut -d '\ t' -f 10000-100000 largefile' – Vijay

+0

@Rahul Dravid: dzięki, dodam to – Drakosha

+6

Możesz skrócić pierwszy:' awk 'NR> = 10000 && NR <= 100000 'largefile', to o jeden proces mniej, a domyślne działanie awk jest drukowane, jeśli zakres jest prawdziwy. Ale to slurps linii afters 100000 na nic, więc lepiej napisać to jak: 'awk 'NR> 100000 {exit} NR> = 10000 && NR <= 100000' largefile' w ten sposób przetwarzanie zatrzyma się na linii 100001. –

15

Niektóre różnice Rozwiązania nt:

Dla rzędu zakresach: W sed:

sed -n 10000,100000p somefile.txt 

Na kolumnie waha się w awk:

awk -v f=10000 -v t=100000 '{ for (i=f; i<=t;i++) printf("%s%s", $i,(i==t) ? "\n" : OFS) }' details.txt 
+0

Wielkie dzięki, Rahul. Dajesz mi dobry kierunek na sed i awk. Chociaż mogę ich używać w prostej operacji, wiele się od ciebie nauczyłem. –

3

został pobity do niego za sed rozwiązania, więc wyślę perl zamiast tego dito. Aby wydrukować wybrane linie.

$ seq 100 | perl -ne 'print if $. >= 10 && $. <= 20' 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 

Aby wydrukować selektywnych kolumn, użyj

perl -lane 'print $F[1] .. $F[3] ' 

-F jest używany w połączeniu z -a, aby wybrać separator, na której można podzielić linie.

Aby przetestować, należy seq i paste aby wygenerować kilka kolumn

$ seq 50 | paste - - - - - 
1 2 3 4 5 
6 7 8 9 10 
11 12 13 14 15 
16 17 18 19 20 
21 22 23 24 25 
26 27 28 29 30 
31 32 33 34 35 
36 37 38 39 40 
41 42 43 44 45 
46 47 48 49 50 

pozwala na drukowanie wszystkiego z wyjątkiem pierwszej i ostatniej kolumnie

$ seq 50 | paste - - - - - | perl -lane 'print join " ", $F[1] .. $F[3]' 
2 3 4 
7 8 9 
12 13 14 
17 18 19 
22 23 24 
27 28 29 
32 33 34 
37 38 39 
42 43 44 
47 48 49 

W sprawozdaniu join powyżej, znajduje się zakładka , otrzymujesz go, wykonując kartę ctrl-v.

4

Dla pierwszego problemu, wybierając zestaw wierszy z dużego pliku, orurowanie od końca do głowy jest bardzo proste. Chcesz 90000 wierszy z pliku bigfile, zaczynając od wiersza 10000.tail chwyta tylny koniec pliku bigfile zaczynając od wiersza 10000, a następnie zamykając wszystkie głowy z wyjątkiem pierwszych 90000 wierszy.

tail -n +10000 largefile | head -n 90000 - 
Powiązane problemy