Чтобы использовать пространство из lv_root
, его необходимо уменьшить. Это возможно только (без переформатирования ), если используемая файловая система поддерживает сжатие; ext3/ext4 подходят, XFS не (в этом отношении).
Соответствующий инструментlvreduce
:
lvreduce -r -L -1G /dev/vg_name/lv_root
Параметры -r
предписывают использовать fsadm
для изменения размера файловой системы перед сжатием LV. Как только он завершится, у вас будет достаточно свободного места в вашей VG, чтобы расширить свой домашний LV.
$ awk -F '[,]' '{ for (i = 2; i <= NF; ++i) print $1, $i }' file
A 1
A 2
B 3
B 2
B 5
C 6
C 7
D 1
D 3
D 5
D 8
При этом строки рассматриваются как состоящие из полей, разделенных пробелами или запятыми. Для каждой строки программа awk
перебирает второе поле до конца строки. Для каждого поля выводится первое поле в строке вместе с текущим полем.
awk '{gsub(/,/, "\n" $1 " "); print}' file
В этом решении мы просто заменяем каждый ",
" на"\n$1 "
Если sed
является вариантом, вы можете сделать:
sed -E ':a s/^([^ ]* )(.*),([^,]*$)/\1\2\n\1\3/; ta' infile
с учетом ввода ниже:
B 2,3,5,6
C 6,7
D 1,3,5,8
([^ ]* )
захват первого столбца (при условии, что пробел является разделителем ); он захватитB
(B , за которым следует пробел). (.*),
фиксирует все до последней запятой; захватит2,3,5
Это ([^,]*$)
захватывает оставшуюся часть строки (т.е. :последнее поле после последней запятой каждый раз ); захватит6
поэтому \1\2\n\1\3
будет выглядеть так, как показано ниже, при первом цикле -для первой строки:
sed -E ':a s/^([^ ]* )(.*),([^,]*$)/\1\2\n\1\3/;q ;ta' infile
B 2,3,5
B 6
следующий цикл -приведет к следующему результату:
B 2,3
B 5
B 6
наконец, в последнем цикле -запуск первой строки будет выводиться, как показано ниже:
sed -E ':a s/^([^ ]* )(.*),([^,]*$)/\1\2\n\1\3/ ;ta ;q' infile
B 2
B 3
B 5
B 6
Теперь прочитайте следующую строку и выполните тот же процесс, пока все строки не продолжатся и не закончатся.
Используя sed
с включенным механизмом расширенных регулярных выражений, мы можем сделать, как показано:
$ sed -re '
s/^((\S+\s+)[^,]+),/\1\n\2/
P;D
' file
С помощью Perl
мы можем сделать так, как:
$ perl -F'\s+|,' -lane '
print join $", splice @F, 0, 2, $F[0] while @F > 1;
' file
Разделить текущую запись на пробелы или запятую и сохранить в массиве с нулевым индексом @F
.
Склеить первые два элемента массива, соединить их одинарным пробелом $"
и распечатать.Также одновременно замените два снятых элемента на первый. Повторяйте этот процесс, пока не останется только один элемент.
Я попробовал описанный ниже метод, и он сработал нормально.
for i in `awk '{print $1}' filename`; do sed -n '/'$i'/p' filename| awk -v i="$i" -F "," '{gsub(i," ",$0)}{for(j=1;j<=NF;j++)print i,$j}'; done
A 1
A 2
B 3
B 2
B 5
C 6
C 7
D 1
D 3
D 5
D 8