Як надрукувати рядки № 15 та 25 з кожного 50 рядків?


9

У мене великий файл, і я хотів би надрукувати з кожного послідовного 50 рядків, 15-го та 25-го рядків.

sed -n '15,25p' inputfile

Як змінити цю команду, щоб надрукувати лише рядки 15 і 25 та перевести цикл на кожні 50 рядків у файлі.

Відповіді:


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

Це був би очевидний портативний спосіб.

Зверніть увагу на sedальтернативу GNU :

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

З будь-яким sedви завжди можете:

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'

(отримати наступний рядок 14 разів, друкувати, наступний рядок 10 разів, друкувати, наступний рядок 25 разів, повернутися до наступного циклу (який захоплює пропущений додатковий рядок, щоб зробити 50)).


10

це робота для awk

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

редагувати: Мене введено в оману інструкцією sed в ОП.


9

З perl

1) Подібно до awkрішення, $.номер рядка змінної зберігає

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

2) Перевірте список номерів рядків, які простіше розширити

$ 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

Інший підхід із використанням awk, заснований на ідеї Sundeep щодо використання списку:

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

Встановіть клавіші в масиві aна основі ліній, які потрібно надрукувати. Роздрукуйте рядки, де NR % 50відповідає одному з ключів у масиві.


Щоб дати деяку оцінку ефективності, я приуротив цей підхід і порівняв з іншими відповідями, забираючи в середньому userчас на 3 пробіжки.

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,542с

$ time perl -ne 'print if grep {$_==$.%50} (15,25)' <(seq 1000000) > /dev/null
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.