Можно ли это преобразовать:
1 Alice
1 Bob
1 Cary
2 Dan
3 Eve
3 Fred
в это:
1 Alice,Bob,Cary
2 Dan
3 Eve,Fred
используя оболочку? (без Perl, Ruby, Python и т. д.)
Использование ассоциативных массивов в bash версии 4:
declare -A ary
while read line; do
set -- $line
ary[$1]+="$2,"
done < input_file
for key in ${!ary[@]}; do
printf "%s %s\n" $key ${ary[$key]%,} # the "%," strips the trailing comma
done
Дерьмо, я не смог устоять перед вызовом. Вот мое решение в оболочке (а точнее, bash) в качестве единственного лайнера:
k=0; while read i j; do if [ $k -eq $i ]; then echo -n ",$j"; \
else [ $k -gt 0 ] && echo; echo -n "$i $j"; k=$i; fi; done \
</tmp/infile; echo
который производит желаемый результат, правильно отформатированный:
1 Alice,Bob,Cary
2 Dan
3 Eve,Fred
Предположения:
Если №2 недействителен, вам нужно запустить ввод через sort(1)
сначала с числовой сортировкой, чтобы расположить их в правильном порядке.
Если я узнаю, что только что ответил на вашу домашнюю работу, я буду очень раздражен. Меня утешает то, что если ваш учитель увидит то, что я написал, он подумает, что вы чокнутый.
Этот в stackoverflow очень похож и имеет несколько хороших ответов: https://stackoverflow.com/questions/380817/best-way-to-simulate-group-by-from-bash