Пропустить 99 строк из каждых 100

В awk, насколько мне известно, не обойтись без явного цикла:

awk '{for (i=2;i<=1000;i++) $i /= 1000} 1' file1 > file2

Если в вашей системе установлена ​​GNU Coreutils, вы можете попробовать

numfmt --to-unit=1K --format='%.3f' --field=2-1000 < file1 > file2

В зависимости от масштаба вводимых значений может потребоваться настроить точность(%.3f).

1
22.05.2021, 13:23
5 ответов

Напечатать 1 ст строку и пропустить следующие N -1 строки из каждых N строк.

awk -v N=100 'NR%N==1' infile

тест с:

$ seq 1000 |awk -v N=100 'NR%N==1'
1
101
201
301
401
....

чтобы передать количество строк, которые вы хотите пропустить, мы также можем прочитать это из параметра, поэтому:

$ seq 1000 |awk -v Num=100 -v Skip=98 '(NR-1)%Num<Num-Skip'
1
2
101
102
201
202
301
302
401
402
501
502
601
602
701
702
801
802
901
902
10
28.07.2021, 11:30

если GNU sedявляется опцией, вы можете использовать адресацию first~step:

seq 1000 | sed '1~100!d'

или более редкий:

seq 1000 | sed -n '1~100p'

Другие способы вawk:

seq 1000 | awk -v l=100 'NR == 1 || c++ == l {c=1; print}'

Это напечатает первую строку, а затем пропустит столько строк, сколько вы укажете в переменной l.

2
28.07.2021, 11:30
seq 1000| awk -v x=1 'NR==x{print ; x=NR+100}'

выход

1
101
201
301
401
501
601
701
801
901
2
28.07.2021, 11:30

Использование GNUsplit:

$ split -n r/1/100 input

Мы можем проверить это с помощью seqилиjot:

$ jot 500 | split -n r/1/100 
$ seq 500 | split -n r/1/100 

## 1
## 101
## 201
## 301
## 401

Изcoreutils:

r/k/n likewise but only output kth of n to stdout

-n r/1/100Печатает только первую строку из каждой сотни строк. Аналогично
-n r/2/100будет печатать вторую строку из каждой сотни строк.

Я ничего не сделал, но слегка изменил команду в ответ .

Сperl:

$ perl -ne 'print if $_ % 100 == 1' input

Это команда perl, аналогичная команде, описанной в этом ответе .

3
28.07.2021, 11:30

@αғsнιη уже показал вам, как сделать то, о чем вы просили (пропустить определенное количество строк )но, похоже, вам лучше просто не печатать последующие строки, которые отличаются только «временной меткой и некоторыми незначительными flags», а не вычислять конкретное количество строк, которые нужно пропустить. Если да, то вот как бы вы это сделали, если бы эти «отметки времени и некоторые второстепенные флаги» хранились в полях 3, 6, 8 и 17:

awk '
{
    origRec = $0
    $3=$6=$8=$17=""
    currKey = $0
}
currKey != prevKey {
    print origRec
    prevKey = currKey
}
' file

Вы можете легко изменить приведенное выше, чтобы напечатать не только первую строку каждой похожей группы, но и последнюю строку, чтобы вы могли видеть первую и последнюю временные метки, если это полезно, и/или вы можете добавить печать количество пропущенных похожих строк.

6
28.07.2021, 11:30

Теги

Похожие вопросы