Làm thế nào để in các dòng số 15 và 25 trên mỗi 50 dòng?


9

Tôi có một tệp lớn và tôi muốn in từ mỗi dòng 50 dòng liên tiếp, dòng thứ 1525 .

sed -n '15,25p' inputfile

Cách sửa đổi lệnh này để chỉ in các dòng 15 và 25 và lặp qua mỗi 50 dòng trong tệp.

Câu trả lời:


22
awk 'NR % 50 == 15 || NR % 50 == 25'

sẽ là cách di động rõ ràng.

Lưu ý một sedthay thế GNU :

sed '15~50b;25~50b;d'

Với bất kỳ sed, bạn luôn có thể làm:

sed -n 'n;n;n;n;n;n;n;n;n;n;n;n;n;n;p;n;n;n;n;n;n;n;n;n;n;p;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n'

(nhận dòng tiếp theo 14 lần, in, dòng tiếp theo 10 lần, in, dòng tiếp theo 25 lần, quay lại chu kỳ tiếp theo (lấy dòng bổ sung còn thiếu để thực hiện 50)).


10

đây là một công việc cho awk

awk '(NR%50==15) || (NR%50==25)' inputfile

chỉnh sửa: Tôi đã bị đánh lừa bởi hướng dẫn sed trong OP.


9

Với perl

1) Tương tự như awkgiải pháp, $.biến lưu trữ số dòng

$ seq 135 | perl -ne 'print if $.%50==15 || $.%50==25'
15
25
65
75
115
125

2) Kiểm tra danh sách các số dòng, dễ dàng mở rộng hơn

$ seq 135 | perl -ne 'print if grep {$_==$.%50} (15,25)'
15
25
65
75
115
125

$ seq 135 | perl -ne 'print if grep {$_==$.%50} (15,25,32)'
15
25
32
65
75
82
115
125
132

4

Một cách tiếp cận khác sử dụng awk, dựa trên ý tưởng sử dụng danh sách của Sundeep :

awk 'BEGIN { a[15] a[25] }; NR % 50 in a'

Đặt các phím trong mảng adựa trên các dòng bạn muốn in. In các dòng NR % 50khớp với một trong các phím trong mảng.


Để đưa ra một số dấu hiệu về hiệu suất, tôi đã tính thời gian cho phương pháp này và so sánh với các câu trả lời khác, lấy trung bình userthời gian cho 3 lần chạy.

0,276

$ time awk 'BEGIN { a[15] a[25] }; NR % 50 in a' <(seq 1000000) > /dev/null

0,374

$ time awk 'NR % 50 == 15 || NR % 50 == 25' <(seq 1000000) > /dev/null

0,384

$ time perl -ne 'print if $.%50==15 || $.%50==25' <(seq 1000000) > /dev/null

0,542s

$ time perl -ne 'print if grep {$_==$.%50} (15,25)' <(seq 1000000) > /dev/null
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.