#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