Используйте
for i in `awk '/}/ {if (NR!=1) print "";next} \
{printf "%s ",$0,"}"}END{print ""}' yt.txt \
|awk '{print $1}'|sort|uniq \
`; \
do \
awk '/}/ {if (NR!=1) print "";next} \
{printf "%s ",$0,"}"}END{printf ""} \
' yt.txt \
|grep "$i"|sed 's/ /\n/g'|grep -v "$i"|sort|uniq \
|awk -v var="$i" ' NR==1 {printf var} {print $0} END {print "}"}' \
;done \
Та же команда в 1 строке ниже (для копирования)
for i in `awk '/}/ {if (NR!=1) print "";next} {printf "%s ",$0,"}"}END{print ""}' yt.txt|awk '{print $1}'|sort|uniq` ; do awk '/}/ {if (NR!=1) print "";next} {printf "%s ",$0,"}"}END{printf ""}' yt.txt|grep "$i"|sed 's/ /\n/g'|grep -v "$i"|sort|uniq|awk -v var="$i" ' NR==1 {printf var} {print $0} END {print "}"}' ;done
Объяснение:
Часть for
вернет вам уникальный заголовок блока (abcd/efgh/a.jar
,lkmn/opqr/b.zip
) и передать его в блок do
. Часть do
сначала будет grep
все строки для каждого заголовка, которые также будут включать дубликаты. Затем он исключит заголовок и объединит все оставшиеся строки под этим блоком заголовков, а затем добавит заголовок в первую строку. И хардкод }
в конце.
Пример
bash-4.2$ cat yt.txt
abcd/efgh/a.jar
{
abcd/efgh/a.class
cdef/ghij/b.class
klmn/opqr/c.class
}
lkmn/opqr/b.zip
{
abcd/efgh/a.class
cdef/ghij/b.class
}
abcd/efgh/a.jar
{
cdef/ghij/b.class
d.class
}
bash-4.2$ for i in `awk '/}/ {if (NR!=1) print "";next} {printf "%s ",$0,"}"} \
> END{print ""}' yt.txt |awk '{print $1}'|sort|uniq` \
> ; do awk '/}/ {if (NR!=1) print "";next} {printf "%s ",$0,"}"}END{printf ""}' yt.txt \
> |grep "$i"|sed 's/ /\n/g'|grep -v "$i"|sort|uniq \
> |awk -v var="$i" ' NR==1 {printf var} {print $0} END {print "}"}'\
> ;done
abcd/efgh/a.jar
{
abcd/efgh/a.class
cdef/ghij/b.class
d.class
klmn/opqr/c.class
}
lkmn/opqr/b.zip
{
abcd/efgh/a.class
cdef/ghij/b.class
}
У вас есть две проблемы: идентификация диска и идентификация раздела.
Grub считает разделы с 0, Linux считает разделы с 1. Итак, если Grub hd0
- это sda
Linux, то Grub (hd0,5)
- это Linux sda6
.
Раздел, который вы выбираете в качестве «корневого» в Grub, не обязательно является корневым разделом Linux. В Grub «root» - это просто ярлык, позволяющий не вводить обозначение раздела перед именами файлов. Если у вас есть отдельный раздел / boot
, вы обычно устанавливаете его как корень Grub, потому что Grub заботится только о том, что находится в / boot
(образ ядра и начальный образ RAM-диска ). Linux не заботится о том, что находится в / boot
, кроме как обновить его.
Нумерация дисков в Grub и Linux может не совпадать. Grub использует BIOS компьютера для перечисления дисков. У Linux есть свои драйверы. Когда диски подключаются через другой интерфейс, трудно предсказать, в каком порядке они будут пронумерованы; это может быть тот, на который контроллер диска отвечает быстрее. Итак, hd0
Grub не обязательно является Linux sda
.
Чтобы ваш компьютер загружался надежно, независимо от того, как подключены диски и какова синхронизация ответов контроллера, используйте метки или UUID вместо буквенно-цифровых обозначений. После загрузки запустите update-grub
- обычно он должен сгенерировать файл /boot/grub/grub.cfg
с использованием UUID. И Grub, и Linux будут перечислять доступные разделы при запуске и запоминать их UUID. В grub.cfg
вы должны увидеть такие строки, как
search --no-floppy --fs-uuid --set=root 82aecd65-6423-4d95-9319-3034263ee747
и
linux /vmlinux root=UUID=82aecd65-6423-4d95-9319-3034263ee747 ro