2011-06-27 33 views
15

Tôi muốn có lời khuyên/trợ giúp của bạn về cách tập hợp một tệp lớn (hàng triệu hàng hoặc đường).cách đặt tập tin - chọn một số hàng hoặc cột

Ví dụ,

(1) Tôi có tập tin lớn (hàng triệu dòng, tab-delimited). Tôi muốn tập hợp con của tệp này chỉ có các hàng từ 10000 đến 100000.

(2) Tôi có tệp lớn (hàng triệu cột, phân tách bằng tab). Tôi muốn một tập hợp con của tệp này chỉ có các cột từ 10000 đến 100000.

Tôi biết có các công cụ như đầu, đuôi, cắt, tách và awk hoặc sed. Tôi có thể sử dụng chúng để làm việc đơn giản. Nhưng, tôi không biết làm thế nào để thực hiện công việc này.

Bạn có thể đưa ra lời khuyên nào không? Cảm ơn trước.

Trả lời

22

hàng Filtering là dễ dàng, ví dụ với AWK:

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

cột lọc dễ dàng hơn với CUT:

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

Như Rahul Dravid đã đề cập, cat không là điều bắt buộc ở đây, và như Zsolt Botykai đã thêm bạn có thể cải thiện hiệu suất sử dụng:

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

+1 đây là câu trả lời đơn giản nhất mà tôi có thể nghĩ đến. Nhưng con mèo không được yêu cầu ở đây.chúng tôi có thể làm điều này mà không cần cat.'awk 'NR> = 10000 && NR <= 100000 {print}' largefile' và 'cut -d '\ t' -f 10000-100000 largefile' – Vijay

+0

@Rahul Dravid: cảm ơn, tôi sẽ thêm nó – Drakosha

+6

Bạn có thể rút ngắn tệp đầu tiên thành:' awk 'NR> = 10000 && NR <= 100000 'tệp lớn', đó là một quy trình ít hơn và hành động mặc định của awk sẽ được in nếu phạm vi đánh giá là đúng. Nhưng đó là slurps các dòng afters 100000 cho không có gì, vì vậy tốt hơn viết nó như: 'awk 'NR> 100000 {exit} NR> = 10000 && NR <= 100000' largefile' như cách xử lý sẽ dừng lại trên dòng 100001st. –

15

Một số khác biệt giải pháp nt:

Đối với hàng dao động: Trong sed:

sed -n 10000,100000p somefile.txt 

Đối với cột dao động trong 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

Cảm ơn rất nhiều, Rahul. Bạn cho tôi một hướng tốt trên sed và awk. Mặc dù tôi có thể sử dụng chúng trong hoạt động đơn giản, tôi đã học được nhiều từ bạn. –

3

Được đánh đến nó cho các giải pháp sed, vì vậy tôi sẽ đăng một perl dito. Để in các dòng đã chọn.

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

Để in các cột có chọn lọc, sử dụng

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

-F được sử dụng kết hợp với -a, để chọn dấu phân cách trên để tách dòng.

Để kiểm tra, sử dụng seqpaste để tạo ra một số cột

$ 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 

phép của in tất cả mọi thứ trừ người đầu tiên và cột cuối cùng

$ 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 

Trong join tuyên bố trên, có một tab , bạn nhận được nó bằng cách làm một tab ctrl-v.

4

Đối với vấn đề đầu tiên, chọn một tập hợp các hàng từ một tệp lớn, đường ống đuôi đến đầu rất đơn giản. Bạn muốn 90000 hàng từ tệp lớn bắt đầu từ hàng 10000.đuôi lấy phần cuối của tập tin lớn bắt đầu từ hàng 10000 và sau đó cắt đầu ra tất cả trừ 90000 hàng đầu tiên.

tail -n +10000 largefile | head -n 90000 - 
Các vấn đề liên quan