Простое решение awk
может выглядеть следующим образом:
awk -F: 'length() && $1!=s {s=$1;print s} {print $2}' input.txt
Это работает путем захвата первого разделенного двоеточиями «поля», и, если оно отличается от предыдущей строки, его печать ...а затем распечатываете второе «поле», в котором находится ваш контент.Если вы хотите, чтобы выходные данные были более точными, это достаточно просто:
awk -F: 'length() && $1!=s {s=$1;print s ":"} length() {gsub(/^ /,"",$2);print $2}' input.txt
Мы используем length()
в качестве условия, потому что в противном случае тест $1!=s
будет соответствовать пустым строкам.
ПоочередноВы можете сделать это только в bash, реализовав похожую логику:
while IFS=: read a b; do [[ -n "$a" ]] && [[ $s != $a ]] && s="$a" && printf '%s:\n' "$s"; printf '%s\n' "${b## }"; done < input.txt
Или для более простого чтения:
while IFS=: read a b; do
if [[ -n "$a" ]] && [[ $s != $a ]]; then
s="$a"
printf '%s:\n' "$s"
fi
printf '%s\n' "${b## }"
done < input.txt
Я включил более сложное форматирование в этом.