0

次のようなタブ区切りのペアのリストがあります。

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:これは学習用の質問です。解決策が短いか長いかはあまり気にしません(ただし、短い方が望ましいです)。この問題を解決する他の方法を学びたいです。

この問題を最速で解決したいのであれば、ここでこの質問をするのではなく、私が最もよく知っている言語で 3 行を書くのに 30 秒を費やします。

4

1 に答える 1

3

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. 前者の場合、スクリプトの約 3 行と、結果を生成するためにさらにいくつかの行を意味します。だから私はそれが短い方法ではないと思います。しかし、私の限定的ではあるが長期にわたる経験からの理論的なものです。また、もっと簡単な方法があれば知りたいです。私も学びたいです:)

于 2011-02-15T12:37:31.620 に答える