diff --git a/contrib/pacsysclean.sh.in b/contrib/pacsysclean.sh.in index 8f2eea3..85d5025 100644 --- a/contrib/pacsysclean.sh.in +++ b/contrib/pacsysclean.sh.in @@ -34,33 +34,33 @@ if [ -n "$1" ]; then esac fi -IFS=$'\n' -name="^Name.*: (.*)$" -size="^Installed Size.*: (.*) KiB$" - [[ $PACMAN_OPTS && $PACMAN_OPTS != -* ]] && PACMAN_OPTS="-$PACMAN_OPTS" -for line in $(LANG=C pacman -Qi $PACMAN_OPTS); do - if [[ $line =~ $name ]]; then - printf "%s\t" ${BASH_REMATCH[1]} - elif [[ $line =~ $size ]]; then - printf "%s\n" ${BASH_REMATCH[1]} - fi -done | sort -g -k2 | awk ' +LANG=C pacman -Qi $PACMAN_OPTS | gawk ' BEGIN { + PROCINFO["sorted_in"] = "@ind_num_asc" split("KiB MiB GiB TiB PiB EiB ZiB YiB", suffix) } function format_size(size) { count = 1 while (size + 0 > 1024) { - size /= 1024 - count++ + size /= 1024 + count++ } sizestr = sprintf("%.2f %s", size, suffix[count]) return sizestr } -{ - printf("%s\t%s\n", format_size($2), $1); +/^Name.*:/ { + name = $NF +} +/^Installed Size.*:/ { + size = $(NF - 1) + sizes[size] = sizes[size] ? sizes[size] "," name : name +} +END { + for (size in sizes) { + printf("%s\t%s\n", format_size(size), sizes[size]); + } }' # vim: set noet: