У мене великий файл, і я хотів би надрукувати з кожного послідовного 50 рядків, 15-го та 25-го рядків.
sed -n '15,25p' inputfile
Як змінити цю команду, щоб надрукувати лише рядки 15 і 25 та перевести цикл на кожні 50 рядків у файлі.
У мене великий файл, і я хотів би надрукувати з кожного послідовного 50 рядків, 15-го та 25-го рядків.
sed -n '15,25p' inputfile
Як змінити цю команду, щоб надрукувати лише рядки 15 і 25 та перевести цикл на кожні 50 рядків у файлі.
Відповіді:
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)).
З 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
Інший підхід із використанням 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