Назад | Перейти на главную страницу

Группировка записей с помощью оболочки

Можно ли это преобразовать:

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

Да, есть несколько способов сделать это.

Sort твой друг: Сортировать вики.

Как есть Awk: Awk Howto.

Дерьмо, я не смог устоять перед вызовом. Вот мое решение в оболочке (а точнее, 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

Предположения:

  1. 0 не является допустимой записью в первом столбце данных.
  2. первый столбец уже отсортирован по номерам.

Если №2 недействителен, вам нужно запустить ввод через sort(1) сначала с числовой сортировкой, чтобы расположить их в правильном порядке.

Если я узнаю, что только что ответил на вашу домашнюю работу, я буду очень раздражен. Меня утешает то, что если ваш учитель увидит то, что я написал, он подумает, что вы чокнутый.

Этот в stackoverflow очень похож и имеет несколько хороших ответов: https://stackoverflow.com/questions/380817/best-way-to-simulate-group-by-from-bash