Как заставить ядро ​​Linux использовать для диска определенный размер блока?

sed -ne '
   y/,/\n/;G;s/\n$//

   y/\n_/_\n/;:loop
      /_$/{
         s///
         s/^[^_]*_//
         bloop
      }
   y/\n_/_\n/;P

   s/.*//;H
' input.file | paste -sd' '

Мы ведем реестр по полям, -разделенным запятыми, которые нужно пропустить в пространстве шаблонов в пространстве удержания.

Цикл отсекает пространство шаблона с обоих концов, чтобы достичь ситуации, когда крайний левый созрел для печати. Мы можем представить, что это горящая свеча с обоих концов (, однако скорость горения различна ). Спереди мы вырезаем поле, разделенное запятой -, а с конца опускаем замыкающее \n. Сжигание продолжается до тех пор, пока не останется завершающих строк новой строки.

И теперь диагональный элемент находится впереди пространства шаблона.

Артефакт y/\n_/_\n/предназначен для обхода того факта, что POSIX sedне имеет знака новой строки, инвертированного внутри класса символов, [^\n].

В качестве последнего шага для текущей строки область хранения увеличивается. Команда pasteпредназначена для получения вывода в одной строке.


Если все поля в вашем CSV-файле числовые, вы также можете использовать следующий фрагмент dc. trпредназначен для удаления запятых, поскольку поля постоянного тока разделены пробелами, а отрицательные числа начинаются с _, а не -

.
tr ',-' ' _' < file | dc -e '[q]sq [s0zlk<a]sa [?z0=qzlk1+dsk<an32ancz0=?]s? 0skl?x[]p'

Мы определяем 3 макроса: qдля выхода после завершения, aдля цикла для удаления элементов с конца (извлечения )и ?для настройки цикла для выполнения строки -ориентированное чтение и вызов макроса a, а затем печать элемента diagnol, который теперь открыт.

tr... |
dc -e '
   # quit macro
   [q]sq

   # macro to pop elements from stack till they are more than counter k
   [s0 zlk<a]sa

   # do-while loop for reading lines
   [
      ?z0=q       # quit if line read is empty
      zlk1+dsk<a  # increment the counter k and compare it against NF (z) call a if >
      n 32an      # print the diagonal element and a space (no newlines)
      c z0=?      # invoke myself again 
   ]s?

   # main
   0sk  # initialize the counter k
   l?x  # call the macro ? to start the file read-in loop
   []p  # print a trailing newline
'

Выход:

1 7 3 9 5
1
17.09.2019, 23:03
1 ответ

Вы можете использовать losetupдля создания кольцевого устройства с другим размером логического сектора.

   -b, --sector-size size
          Set  the  logical sector size of the loop device in bytes (since
          Linux 4.14). The option may be used when create a new  loop  de‐
          vice as well as stand-alone command to modify sector size of the
          already existing loop device.

Так например:

# losetup --find --show --sector-size 512 /dev/thething
/dev/loop2
# losetup --find --show --sector-size 2048 /dev/thething
/dev/loop3
# losetup --find --show --sector-size 4096 /dev/thething
/dev/loop4
# blockdev --getss /dev/loop2
512
# blockdev --getss /dev/loop3
2048
# blockdev --getss /dev/loop4
4096

Изменение уже существующего контурного устройства:

# blockdev --getss /dev/loop4
4096
# losetup --sector-size 1024 /dev/loop4
# blockdev --getss /dev/loop4
1024

Однако некоторые USB-адаптеры также имеют другие странности, например, некоторые не предоставляют вам доступ к полной емкости диска, например, некоторые USB-мосты имеют возможности шифрования или RAID, поэтому они могут резервировать несколько секторов для метаданных.

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

4
27.01.2020, 23:22

Теги

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