awk(またはPerl)内の一意の関連付け値の数を計算します。

awk(またはPerl)内の一意の関連付け値の数を計算します。

私は見つけた「列1の固有値発生回数を増分して印刷する方法」、これは私の質問に似ていますが、答えは私の目的には十分ではありません。

まず私を見てみましょう言う私がしたいこと:

# Example input
apple   abc jkl
apple   xyz jkl
apple   abc xyz
apple   qrs xyz
apple   abc jkl
banana  abc lmno
banana  lmnop   xyz
banana  lmnopq  jkl
banana  abc jkl
banana  lmnop   pqrs
banana  abcdefg tuv
cucumber    abc lmno
cucumber    abc jkl
cucumber    abc xyz
cucumber    abcd    jkl
cucumber    abc jkl
cucumber    abc lmno

# Desired output
apple   3   2
banana  4   5
cucumber    2   3

したがって、フィールド1の個々の値ごとに、そのフィールドとフィールド2とフィールド3の固有の関連値の数が印刷されます。

入力は最初のフィールドでソートされますが、他のフィールドでソートすることはできません(2番目と3番目のフィールドの両方を処理する必要があるため役に立ちません)。

私はそれを好みますawk。おそらくPerlははるかに簡単になり、何をするかを学びたいのですが、awkスクリプトを作業していて、全体を書き直したくありません。

私は方法を見つけました。働くしかし、かなり長く、私には陳腐に見えます。私はこれを答えとして投稿します(事務室に戻ると)。しかし実際の内容を見たいです。いいね近い。 (私は私が「良い」とは思わない。)

ベストアンサー1

そしてawk

awk 'function p(){print l,c,d; delete a; delete b; c=d=0} 
  NR!=1&&l!=$1{p()} ++a[$2]==1{c++} ++b[$3]==1{d++} {l=$1} END{p()}' file

説明する:

  • function p()p():値を印刷し、使用された変数と配列を削除する関数を定義します。
  • NR!=1&&l!=$1最初の行ではなく、変数lが最初のフィールドと同じ場合、$1関数p()は実行されます。
  • ++a[$2]==1{c++}aインデックス配列の要素値の増加が$2その値と等しい場合、1その値が最初に表示されるため、c変数が増加します。新しい値は要素の前に返されるため、++それと比較する前に増加が発生します1
  • ++b[$3]==1{d++}上記と同じですが、3番目のフィールドとd変数があります。
  • {l=$1}l最初のフィールドに(次の繰り返しのために..上)
  • END{p()}最後の行を処理した後、awk最後のブロックの値を印刷する必要があります。

与えられた入力に基づいて、出力は次のようになります。

apple 3 2
banana 4 5
cucumber 2 3

おすすめ記事