Sed / Awk удаляя выборочные строки - PullRequest
0 голосов
/ 09 февраля 2011

Это может быть простой вопрос, но я изо всех сил пытаюсь найти решение, может ли кто-нибудь предоставить простую команду UNIX sed или awk для удаления каждой 3-й и 4-й строки файла, начиная с 5-й строки.

Ответы [ 4 ]

2 голосов
/ 09 февраля 2011

решение awk, где вы передаете свои числа в качестве параметров:

awk -v start=5 -v d1=3 -v d2=4 '
    {n = NR - start}
    n > 0 && (n % d1 == 0 || n % d2 == 0) {next} 
    1
'

При этом пропускаются строки 8, 11, 14, ... и 9, 13, 17, ...

2 голосов
/ 09 февраля 2011

Предполагая, что я понял требования, вы можете использовать awk следующим образом:

pax$ echo '1
2
3
4
5
6
7
8
9
10
11
12
13
14
15' | awk '{if (((NR - 5) % 4 < 2) || (NR < 5)) {print}}'
1
2
3
4
5
6
9
10
13
14

Как видите, здесь используется NR (номер строки), чтобы решить, стоит ливыведите строку.

Начиная со строки 5, она печатает два, затем пропускает два до бесконечности.Ниже 5 он печатает все.

Если я неправильно понял , какие строк вы хотите пропустить, теория все еще верна, вам просто нужно настроить оператор if.

2 голосов
/ 09 февраля 2011

Если вы используете GNU sed, вы можете использовать адресный формат FIRST~STEP, например,

sed -e '6~3 d' -e '8~4 d' file

удаляет 6-ю строку, затем каждую 3-ю и удаляет 8-ю строку, затем каждые 4-ю.

0 голосов
/ 09 февраля 2011

Как насчет Perl?

perl -pi -e 'print if $. < 5 or 1 == $. % 4 or 2 = $. % 4' your_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...