Как получить n строк для каждых m строк (n

В качестве альтернативы вы можете использовать хороший инструмент под названием kpartx. Из man-страницы:

kpartx - Создание карт устройств из таблиц разделов

Это означает, что вы можете создать "псевдоустройство" с разделами устройств прямо из файла img:

$ kpartx -av sdb.img
add map loop0p1 (254:2): 0 2048 linear /dev/loop0 0
add map loop0p2 (254:3): 0 31162 linear /dev/loop0 2048
$ lsblk
.
.
.
loop0                     7:0    0  16.2M  0 loop
├─loop0p1               254:2    0     1M  0 part
└─loop0p2               254:3    0  15.2M  0 part

Затем вы можете смонтировать /dev/mapper/loop0p2, например, если вам нужен второй раздел образа.

7
12.02.2017, 18:35
4 ответа

С gnu split :

n=2
m=4 
split -l ${m} --filter="head -n ${n}" infile

и если вы хотите сделать это только после i -й строки, просто перенаправьте предыдущие строки на / dev / null :

n=2
m=4 
i=7
{ head -n ${i} >/dev/null; split -l ${m} --filter="head -n ${n}"; } <infile

Если у вас нет доступа к инструментам gnu , вы можете использовать awk :

awk -vn=2 -vm=4 -vi=7 'NR<=i{next}; (NR-i)%m==1{c=1}; c++<=n' infile
12
27.01.2020, 20:13

Или это, gnu sed :

sed -n -e '1~4 {N; p;}' file

-n подавляет вывод. Если в строке 1 + 4 * k (k = итератор) текущая строка и следующая строка считываются в пространство шаблонов и p печатает (текущую) пространство шаблонов (т.е. временное включение вывода)

4
27.01.2020, 20:13

Для GNU sed

sed '3~4,+1 d' file

или более общего:

m=4
n=2
sed "$((m-n+1))~$m,+$((m-n-1)) d" file
5
27.01.2020, 20:13

Вы можете использовать ~ в адресе в GNU sed:

sed -n '1~4p;2~4p'

который гласит: «Печатать первую строку каждые 4 строки и печатать вторую строку каждые 4 строки» или «Начиная со строки 1, печатать каждую 4-ю строку и начиная со строки. 2, выведите каждую 4-ю строку ».

15
27.01.2020, 20:13

Теги

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