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
Вы можете использовать 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, поэтому они могут резервировать несколько секторов для метаданных.
Поэтому, если возможно, предпочтительнее использовать аппаратное обеспечение, которое делает то, что вам нужно, без обходных путей.