Использованиеawk
:
awk '{ group[$2] = (group[$2] == "" ? $1 : group[$2] OFS $1 ) }
END { for (group_name in group) print group_name, group[group_name] }' inputfile
Это сохраняет группы в массиве с именем group
. Этот массив индексируется по имени группы (, второму столбцу входных данных ), и для каждой строки ввода из inputfile
значение в первом столбце добавляется к правильной группе.
Блок END
перебирает все собранные группы и выводит имя группы и записи этой группы.
Эта awk
программа с более удобным расположением элементов:
{
group[$2] = (group[$2] == "" ? $1 : group[$2] OFS $1 )
}
END {
for (group_name in group)
print group_name, group[group_name]
}
Обратите внимание, что это не то, что вы хотели бы сделать, если у вас есть огромные объемы данных, поскольку массив group
фактически будет хранить все входные данные, считанные из файла..
Для больших объемов данных мы предполагаем, что ввод отсортирован по именам групп (второй столбец )и используем
awk '$2 != group_name { if (group != "") print group_name, group; group = ""; group_name = $2 }
{ group = (group == "" ? $1 : group OFS $1) }
END { if (group != "") print group_name, group }' inputfile
Это отслеживает, что представляет собой текущая группа, и собирает данные для этой группы. Всякий раз, когда второй столбец во входных данных переключается на другое значение, он выводит собранные групповые данные и начинает собирать новые данные. Это означает, что всегда сохраняется только несколько строк ввода, а не весь набор входных данных.
Эта последняя awk
программа с более красивым макетом:
$2 != group_name {
if (group != "")
print group_name, group
group = ""
group_name = $2
}
{
group = (group == "" ? $1 : group OFS $1)
}
END {
# Output last group (only), if there was any data at all.
if (group != "")
print group_name, group
}
Спасибо @sudodus и @fra -сан.
Я думаю, что существует проблема совместимости при объединении resize2fs
и parted
для сжатия файла fs/partition. resize2fs использует блоки по 4 КБ, при разделении используются байты или МБ, ГБ и т. д.
В конце концов я нашел другой способ уменьшить размер второго раздела:gnome-disks
. Он поставляется с Linux Mint и работает очень хорошо. Там, где parted и gparted не удалось сжать второй раздел, дискам gnome -удалось изменить размер как fs, так и раздела за одну операцию.
После сжатия fs/partition в loop0p2 осталось пустое место. Я хочу уменьшить файл изображения. Итак, я сделал:
root@O3:/home/m# fdisk -l /dev/loop0
Disk /dev/loop0: 7,5 GiB, 8068792320 bytes, 15759360 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x8889db7f
Device Boot Start End Sectors Size Id Type
/dev/loop0p1 8192 532479 524288 256M c W95 FAT32 (LBA)
/dev/loop0p2 532480 8355839 7823360 3,7G 83 Linux
обрезать размер? (8192 + 524288 + 7823360)*512 = 4278190080 Б
truncate --size=4278190080 image-file.img
После повторного сопоставления результирующего файла образа с loop0 ошибок fs/partition больше нет.