行を特定の回数だけ繰り返す[繰り返し]

行を特定の回数だけ繰り返す[繰り返し]

複数の列を含むファイルがあり、列3の値が繰り返される行を識別しました。

入力例:

A B C
1 2 APPLE
3 4 PEAR
9 3 LEMON
8 3 ORANGE
8 2 APPLE
3 4 APPLE
9 3 LEMON
8 3 PEAR

以下を使用して、3列の単語がどれだけ頻繁に繰り返されるかを計算できます。

awk '{print $3}' [input filename] | sort | uniq -c > [output filename]

出力:

3 APPLE
2 PEAR
2 LEMON
1 ORANGE

私が望むのは、3回繰り返される行を維持することです。

希望の出力:

APPLE

または

1 2 APPLE
8 2 APPLE
3 4 APPLE

すべての列が元の入力ファイルから印刷されるのか、3番目の列値のみが印刷されるのかは重要ではありません。

を使用すると、sort -u少なくとも1回発生するすべての行が印刷されますが、これは私が望むものではありません。

答え1

もう一つの方法は、ファイルを2回チェックすることです。まず、参照を作成し、2番目に必要に応じてフィルタリングします。

$ awk 'NR==FNR{a[$3]++; next} a[$3]==3' ip.txt ip.txt 
1 2 APPLE
8 2 APPLE
3 4 APPLE

$ awk 'NR==FNR{a[$3]++; next} a[$3]==2' ip.txt ip.txt 
3 4 PEAR
9 3 LEMON
9 3 LEMON
8 3 PEAR

$ awk 'NR==FNR{a[$3]++; next} a[$3]<2' ip.txt ip.txt 
A B C
8 3 ORANGE

答え2

アッ解決策:

- 発生項目のみ出力少なくとも3番:

awk '++a[$3]==3{ print $3 }' file
  • ++a[$3]- 3番目のフィールドの固有値の数が連続的に増加します。

- 発生項目のみ出力正確に3番:

awk '{++a[$3]}END{ for(i in a) if(a[i]==3) print i }' file

出力:

APPLE

答え3

パイプの出力を渡すawk '$1 == 3 { print $2 }'ことによってAPPLE

awkまたは最初から計算を始めてください。

awk '{ c[$3]++; r[$3] = r[$3] ? r[$3] ORS $0 : $0 } END { for (i in c) { if (c[i] == 3) print r[i] } }' file
1 2 APPLE
8 2 APPLE
3 4 APPLE

スクリプトはawk、のc列3の値の発生回数を計算します。各入力行rに連想配列を追加します。たとえば、c3番目の列に入力します。

最後に、3番目の列が正確に3回現れる行だけが出力されます。

答え4

いいですね。最もエレガントな方法ではないかもしれませんが、次の方法が効果的です。各行を解析して、すでに行った操作を拡張します。発生数が 2 を超えないコンテンツをフィルタリングします。

awk '{print $3}' yourInputFile | sort | uniq -c | while read -r line
   do 
      echo $line | [ `awk '{print $1}'` -gt 2 ] && echo $line | awk '{print $2}'
   done

表示を次に制限する場合発生数が正確に3の行、はるかに簡単です。 Aは、grepコメントに提案されているとおりに使用できます@wvxvw。この場合、繰り返す必要はありませんが、grep3で始まりますが、30などのより大きな値を取得しないようにマスクする必要があります。

awk '{print $3}' yourInputFile | sort | uniq -c | grep '^\s*3\s' | awk '{print $2}'

どちらの場合も、出力は次のようになります。

APPLE

関連情報