В 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 ст строку и пропустить следующие 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
если 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
.
seq 1000| awk -v x=1 'NR==x{print ; x=NR+100}'
выход
1
101
201
301
401
501
601
701
801
901
Использование 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, аналогичная команде, описанной в этом ответе .
@αғsнιη уже показал вам, как сделать то, о чем вы просили (пропустить определенное количество строк )но, похоже, вам лучше просто не печатать последующие строки, которые отличаются только «временной меткой и некоторыми незначительными flags», а не вычислять конкретное количество строк, которые нужно пропустить. Если да, то вот как бы вы это сделали, если бы эти «отметки времени и некоторые второстепенные флаги» хранились в полях 3, 6, 8 и 17:
awk '
{
origRec = $0
$3=$6=$8=$17=""
currKey = $0
}
currKey != prevKey {
print origRec
prevKey = currKey
}
' file
Вы можете легко изменить приведенное выше, чтобы напечатать не только первую строку каждой похожей группы, но и последнюю строку, чтобы вы могли видеть первую и последнюю временные метки, если это полезно, и/или вы можете добавить печать количество пропущенных похожих строк.