Я хотел бы предложить обобщение с awk.
Когда файл создается блоками фиксированного размера, а строки для удаления повторяются для каждого блока, awk может работать нормально таким образом
awk '{nl=((NR-1)%2000)+1; if ( (nl<714) || ((nl>1025)&&(nl<1029)) ) print $0}'
OriginFile.dat > MyOutputCuttedFile.dat
В этом примере размер для блока - 2000, и я хочу напечатать строки [1..713] и [1026..1029].
NR
- это переменная, используемая awk для хранения номер текущей строки. %
дает остаток (или модуль) деления двух целых чисел: nl=((NR-1)%BLOCKSIZE)+1
Здесь мы пишем переменную nl номер строки внутри текущего блока. (см. ниже) ||
и &&
являются логическим оператором ИЛИ и AND . print $0
записывает полную строку Why ((NR-1)%BLOCKSIZE)+1:
(NR-1) We need a shift of one because 1%3=1, 2%3=2, but 3%3=0.
+1 We add again 1 because we want to restore the desired order.
+-----+------+----------+------------+
| NR | NR%3 | (NR-1)%3 | (NR-1)%3+1 |
+-----+------+----------+------------+
| 1 | 1 | 0 | 1 |
| 2 | 2 | 1 | 2 |
| 3 | 0 | 2 | 3 |
| 4 | 1 | 0 | 1 |
+-----+------+----------+------------+