Использование GNU awk
и GNUcolumn
:
awk -F'[][ ]*' '{print ($(NF-1)==n?OFS:$(NF-1)),$1; n=$(NF-1)}' OFS=, file \
| awk -F, -v OFS=, 'NF==3{line=line RS $0;i++} NF==2{if(line)print i,line; line=$0; i=1}' \
| column -t -n -s,
Первая команда awk извлекает и отображает нужные поля в этом формате:
Papaver_somniferum,ID1
,,ID2
,,ID3
...
Вторая команда awk строит новую строку, состоящую из всех полей с одинаковым именем, и добавляет ее счетчик впереди.
Наконец, команда столбца отображает результат в 3 столбца с помощью опции -n
:
5 Papaver_somniferum ID1
ID2
ID3
ID4
ID5
4 Helianthus_annuus ID6
ID7
...
Предполагая bash, вот «один -лайнер», который делает это:
unset saved; declare -A saved; docker images --format '{{.Repository}} {{.Tag}}' | while read repo tag; do if [[ "$repo" == "m4" ]] || [[ "$tag" == latest ]]; then continue; fi; if [[ "${saved[$repo]}" != true ]]; then docker image save -o "$repo-$tag".tar "$repo:$tag"; saved["$repo"]=true; fi; done
Разделились, чтобы было понятно:
unset saved
declare -A saved
docker images --format '{{.Repository}} {{.Tag}}' | while read repo tag; do
if [[ "$repo" == "m4" ]] || [[ "$tag" == latest ]]; then continue; fi
if [[ "${saved[$repo]}" != true ]]; then
docker image save -o "$repo-$tag".tar "$repo:$tag"
saved["$repo"]=true
fi
done
Это объявляет ассоциативный массив saved
, перечисляет изображения только с их репозиторием и тегом, пропускает latest
изображения и сохраняет изображение, если оно еще не сохранило репозиторий. Для определения последнего при сохранении изображения этот факт записывается в массив saved
; перед сохранением образа массив проверяется, не было ли уже сохранено изображение с таким же репозиторием.
docker images
перечисляет изображения, начиная с самого последнего, поэтому будет сохраняться самое последнее изображение всякий раз, когда несколько изображений используют один и тот же репозиторий (или имя ).
Нет специальной обработки имени архива, поэтому оно может не работать с репозиториями, содержащими косую черту. Также нет обработки изображений без репозитория или тега. Следующая более длинная версия создает соответствующие подкаталоги и пропускает непомеченные изображения :
.unset saved
declare -A saved
docker images --format '{{.Repository}} {{.Tag}}' | while read repo tag; do
if [[ "$repo" == "m4" ]] || [[ "$tag" == latest ]] || [[ "$repo" == "<none>" ]] || [[ "$tag" == "<none>" ]]; then continue; fi
if [[ "${saved[$repo]}" != true ]]; then
if [[ "${repo}" =~ "/" ]]; then mkdir -p "${repo%/*}"; fi
docker image save -o "$repo-$tag".tar "$repo:$tag"
saved["$repo"]=true
fi
done