2010-02-10 33 views
15

tôi cần phải trích xuất một số bộ dòng từ một tập tin cho số dòng bắt đầu và kết thúc số dòng.Nhận một loạt các dòng từ một tập tin được bắt đầu và kết thúc số dòng

Làm sao tôi nhanh chóng làm điều này dưới unix (nó thực sự Solaris hương vị rất gnu không có sẵn).

Thx

+0

Xem thêm: http://stackoverflow.com/questions/1429556/shell-bash-command-to-get-nth-line-of-stdout –

+0

Bản sao có thể có của [Làm cách nào tôi có thể trích xuất một phạm vi các dòng được xác định trước từ một tệp văn bản trên Unix?] (http://stackoverflow.com/questions/83329/how-can-i-extract-a-predetermined-range-of-lines-from-a-text-file-on-unix) – lesmana

Trả lời

40

Để in dòng 6-10:

sed -n '6,10p' file 

Nếu tập tin là rất lớn, và số dòng cuối cùng là nhỏ so với số dòng, bạn có thể làm cho nó hiệu quả hơn bằng cách :

sed -n '10q;6,10p' file 

Từ thử nghiệm một tập tin với một số lượng khá lớn các dòng:

$ wc -l test.txt 
368048 test.txt 
$ du -k test.txt 
24640 test.txt 
$ time sed -n '10q;6,10p' test.txt >/dev/null 
real 0m0.005s 
user 0m0.001s 
sys 0m0.003s 
$ time sed -n '6,10p' test.txt >/dev/null 
real 0m0.123s 
user 0m0.092s 
sys 0m0.030s 
+0

AAARRGGH !! :) đó là tốt hơn so với tôi – ScaryAardvark

+0

Tôi nghĩ về điều đó nhưng không thể làm cho nó ngừng in các dòng khác .. tùy chọn -n .. :) – ScaryAardvark

+3

Rah sed! Sed! Sed! Sed! +1 –

0

bạn có thể làm điều đó với nawk cũng

#!/bin/sh 
start=10 
end=20 
nawk -vs="$start" -ve="$end" 'NR>e{exit}NR>=s' file 
0

Hoặc

head -n "$last" file | tail -n +"$first" 
1

Tôi đã viết một chương trình Haskell gọi splitter thực hiện chính xác này: có một read through my release blog post.

Bạn có thể sử dụng chương trình như sau:

$ cat somefile | splitter 4,6-10,50- 

Đó sẽ nhận được dòng bốn, sáu đến mười và dòng năm mươi trở đi. Và đó là tất cả những gì có. Bạn sẽ cần Haskell để cài đặt nó. Chỉ cần:

$ cabal install splitter 

Và bạn đã hoàn tất. Tôi hy vọng bạn thấy chương trình này hữu ích.

Các vấn đề liên quan