САС выкладывает n-ю и (n + 1) -ю строки - PullRequest
0 голосов
/ 11 января 2019

РЕДАКТИРОВАТЬ: для справки, «материал» является общей переменной, как и «KEEP». Можно оставить «Привет, меня зовут Дейв» в строке 2 и «Я люблю пирог» в строке 7. Цифры, которые я здесь привожу, приведены только для иллюстрации и НЕ отображаются в данных.

У меня был файл, который нужно было проанализировать, сохраняя каждую 4-ю строку, начиная с 3-й строки. Другими словами, это выглядело так:

1 stuff
2 stuff
3 KEEP
4 
5 stuff
6 stuff
7 KEEP
8 stuff etc...

Отлично, sed решил это легко с помощью:

sed -n -e 3~4p myfile

дает мне

3 KEEP
7 KEEP
11 KEEP

Теперь у меня другой формат файла и другой взгляд на шаблон:

1 stuff
2 KEEP
3 KEEP
4
5 stuff
6 KEEP
7 KEEP etc...

и я все еще хочу вывод

2 KEEP
3 KEEP
6 KEEP
7 KEEP
10 KEEP
11 KEEP

Вот в чем проблема - это шаблонный шаблон для sed. Это «каждая 4-я строка, выплюнуть 2 строки, но начать со строки 2».

Нужно ли иметь какой-то цикл DO / FOR в моем sed или мне нужна другая команда, такая как awk или grep? До сих пор я пробовал форматы, такие как:

sed -n -e '3~4p;4~4p' myfile

и

awk 'NR % 3 == 0 || NR % 4 ==0' myfile

и

sed -n -e '3~1p;4~4p' myfile

и

awk 'NR % 1 == 0 || NR % 4 ==0' myfile

источник: https://superuser.com/questions/396536/how-to-keep-only-every-nth-line-of-a-file

Ответы [ 5 ]

0 голосов
/ 12 января 2019

Это может сработать для вас (GNU sed):

sed '2~4,+1p;d' file

Используйте диапазон, первым параметром является начальная линия и модуль (в данном случае из строки 2, модуль 4). Второй параметр - это то, как человек следует за началом диапазона (в данном случае плюс один). Распечатайте эти строки и удалите все остальные.

0 голосов
/ 12 января 2019

В общем случае вы хотите сохранить строки p до p+q и p+n до p+q+n и p+2n до p+q+2n ... Таким образом, вы можете написать:

awk '(NR - p) % n <= q'
0 голосов
/ 11 января 2019

Вы были довольно близки с вашим sed:

$ printf '%s\n' {1..12} | sed -n '2~4p;3~4p'
2
3
6
7
10
11
0 голосов
/ 11 января 2019

это идиоматический способ записи в awk

$ awk 'NR%4==2 || NR%4==3' file

однако этот особый случай можно сократить до

$ awk 'NR%4>1' file
0 голосов
/ 11 января 2019

Если вы намереваетесь напечатать строки 2,3, то каждую четвертую строку после этих двух вы можете сделать:

$ seq 20 | awk 'BEGIN{e[2];e[3]} (NR%4) in e'
2
3
6
7
10
11
14
15
18
19
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...