複数の列を含むファイルがあり、列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
に連想配列を追加します。たとえば、c
3番目の列に入力します。
最後に、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
。この場合、繰り返す必要はありませんが、grep
3で始まりますが、30などのより大きな値を取得しないようにマスクする必要があります。
awk '{print $3}' yourInputFile | sort | uniq -c | grep '^\s*3\s' | awk '{print $2}'
どちらの場合も、出力は次のようになります。
APPLE