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ứ 15 và 25 .
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.
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ứ 15 và 25 .
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:
awk 'NR % 50 == 15 || NR % 50 == 25'
sẽ là cách di động rõ ràng.
Lưu ý một sed
thay 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)).
Với perl
1) Tương tự như awk
giả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
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 a
dựa trên các dòng bạn muốn in. In các dòng NR % 50
khớ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 user
thờ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