Преобразование списка пар в таблицу в оболочке без использования awk - PullRequest
0 голосов
/ 15 февраля 2011

У меня есть список пар, разделенных табуляцией, например:

apple  yellow
orange green
apple  red
pear   blue
apple  yellow
apple  yellow

Я хочу преобразовать его, используя инструменты командной строки Linux, в таблицу:

       yellow green red blue
apple     3     0    1   0
orange    0     1    0   0
pear      0     0    0   1

Могу ли я сделать это с минимальными сценариями вручную?

Примечание: Я знаю, как кодировать это, спасибо, вопрос касается уже существующих инструментов, возможно с минимальным скриптовым клеем И awk программы, если они не очень короткие, считаются «сценариями» в этом отношении.

Примечание 2: Это изучение вопрос. Меня не волнует, если решение короткое или длинное (хотя короткие предпочтительнее). Я хочу изучить другие способы решения этой проблемы.

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

1 Ответ

3 голосов
/ 15 февраля 2011

В awk:

awk '{num[$1,$2]++; fruits[$1]=1; colors[$2]=1}END{for(i in fruits) {for(j in colors) printf("%d ", num[i,j]); printf("\n");}}'

PS.В качестве запоздалой мысли ... Вы можете посмотреть в join утилиту.В сочетании с подсчетами по полям, возможно, это поможет.Но я обещаю, что это будет волосатее.

PPS.Я добавлю это сюда, поскольку поле для комментариев слишком тесное.Александр, тебе нужно что-то для запуска в системе POSIX.Есть некоторое количество логики, вовлеченной в задачу.Будь то вставка в скрипт инструмента или длинная труба с несколькими командами - количество остается примерно одинаковым.Поскольку awk был разработан для создания отчетов, в данном случае это хороший инструмент.
По сути, у вас не так много средств для форматирования текста - это printf утилита / встроенная или awk.В первом случае это означает около трех строк в скрипте и еще несколько для получения результата.Так что я думаю, что нет более короткого пути.Но вроде теоретический из моего ограниченного, хотя и длительного опыта.Я также хотел бы узнать более простой способ, если есть, я тоже хотел бы учиться:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...