私は見つけた「列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