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
=
上記のコードはフィールド区切り文字として使用されます。最初のフィールドがある場合、Global
2番目のフィールドは連想配列のファイルに表示される回数を追跡しますc
。$2
ファイルを完全に読み取ったら、配列を調べて、c
1より大きい数を持つすべての数字を印刷します。
より短いバージョン
提案によるとグレンジャックマンコメント内の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
+0
0
ENDでは、入力に重複する項目がなくても(空の文字列ではなく)数値出力を取得することができます。