Как объединить строки с awk в одну строку с тем же ключом

#awk

#awk

Вопрос:

У меня есть следующий файл

  lion : catty : mouse
 lion : cat   : bear
 rubber: ham  : cheese
  

Я хотел бы объединить каждую строку с ключом (= первое поле), чтобы

 lion : catty : mouse ; cat : bear
rubber: ham : cheese
  

Я сделал это с помощью awk таким образом, но это не работает.

   #!/usr/bin/awk -f
  BEGIN {FS=":"} 
  a[$1]=a[$1] ";" $2 " : " $3
  END{
  for (x in a) print x,a[x]}
  

Я был бы благодарен, если бы какой-нибудь разъем awk мог сказать мне, что я делаю не так.
Спасибо

Комментарии:

1. У вас ДЕЙСТВИТЕЛЬНО есть пустые символы в начале каждой строки ввода и до / после некоторых : символов? Если нет, то, пожалуйста, приведите в порядок свой пример, чтобы отразить реальность, поскольку то, как выглядит ввод, очевидно, имеет большое значение для инструмента, необходимого для анализа этого ввода.

2. Опубликуйте новый вопрос и привяжите к нему этот вопрос. Не публикуйте изображения, публикуйте образцы данных с ожидаемым результатом.

3. @JamesBrown Я так и сделал, спасибо

Ответ №1:

Возможно, это то, что вы ищете:

 $ awk -F' *: *' -v OFS=' : ' '{a[$1] = ($1 in a ? a[$1] " ; " : "") $2 OFS $3} END{for (key in a) print key, a[key]}' file
rubber : ham : cheese
lion : catty : mouse ; cat : bear
  

Комментарии:

1. Спасибо, это работает в командной строке как однострочный. Но когда я пишу это как скрипт, я получаю syntax error at the for (x in a) почему?

2. Я предполагаю, что вы ввели синтаксическую ошибку, когда копировали / вставляли ее? Не видя кода, это лучшее, что я могу сделать, чтобы помочь отладить код.

3. Я обнаружил, что КОНЕЦ в скрипте должен быть перед { — теперь это работает также как awk-скрипт. БОЛЬШОЕ СПАСИБО

Ответ №2:

Попробуйте:

 $ awk -F: '{a[$1]=a[$1] (a[$1]?";":":") $2":" $3} END{for (x in a) print x,a[x]}' file
  lion  : catty : mouse; cat   : bear
  rubber : ham  : cheese
  

Если вы хотите более красивый вывод, попробуйте:

 $ awk -F: '{a[$1]=a[$1] (a[$1]?" ; ":" : ") $2" : " $3} END{for (x in a) print x,a[x]}' file | column -t
lion    :  catty  :  mouse   ;  cat  :  bear
rubber  :  ham    :  cheese