ファイル内の数値の合計反復回数を見つける

ファイル内の数値の合計反復回数を見つける

Global=x 文字列を含むファイルがあります。ここで、x はテキスト行間の数字です。文字列 "Global = x"から抽出された数字 "x"の合計反復回数を計算したいと思います。各「x」の発生回数を印刷したくない。

たとえば、入力ファイルが次のような場合

Global=33333
Global=33333
Global=33334
Global=33335
Global=33336
Global=33337
Global=33337
Global=33337

「33333」と「33337」の2つの数字が繰り返されるので(何回でも構いません)、出力は2にする必要があります。

頑張った

grep -Po '(Global)=\K\d+' file.dat | sort | uniq -c

しかし、私は不要な各数の発生頻度を取得します。

2 33333
1 33334
1 33335
1 33336
3 33337

どんな助けでも大変感謝します。 gre、awk、およびsedソリューションが許可されています。

答え1

uniq -c次のように変更できますuniq -d

$ grep -Po '(Global)=\K\d+' file.dat | sort | uniq -d
33333
33337

-d重複した行だけが印刷されます。他のパイプラインでは、wc -lこれらの行を計算できます。また、grepの-P&オプションはすべて-o非標準なので、すべてのバージョンのgrep

答え2

重複した番号のリストを取得し、すべての追加手順を削除するには:

$ awk -F= '$1=="Global"{c[$2]++} END{for (num in c) if(c[num]>1)print num}' file.dat
33333
33337

=上記のコードはフィールド区切り文字として使用されます。最初のフィールドがある場合、Global2番目のフィールドは連想配列のファイルに表示される回数を追跡しますc$2

ファイルを完全に読み取ったら、配列を調べて、c1より大きい数を持つすべての数字を印刷します。

より短いバージョン

提案によるとグレンジャックマンコメント内の2番目の数字を簡単に印刷できます。

$ awk -F= '++c[$2] == 2 {print $2}' file.dat
33333
33337

答え3

すべてのUNIXシステムのすべてのシェルでawkを使用します。

$ awk -F'=' '++cnt[$2] == 2{ dups++ } END{print dups+0}' file
2

必ず確認する必要がある場合Global

$ awk -F'=' '($1 == "Global") && (++cnt[$2] == 2){ dups++ } END{print dups+0}' file
2

+00ENDでは、入力に重複する項目がなくても(空の文字列ではなく)数値出力を取得することができます。

関連情報