各行で重複した値を見つける

各行で重複した値を見つける

重複(x2)値を持つ行を印刷するには?

例えば

01 02 03
01 01 03
01 01 01 03

これら 3 行のうち 2 行目だけが正確です。

それでは、x3値が発生する行を探したいとしましょう。

この場合、3行が正しいです。

答え1

awkを使う

awk -v nb=3 '{for(i=1;i<=NF;i++)if(++a[$i]>nb){print;next}}' infile

for(i=1;i<=NF;i++) は、行 ++a[$i] のすべてのフィールドにある連想配列 a のすべてのフィールドを取得し、
同じ値を持つフィールドを見るたびにそれをインクリメントします。 。
if(++a[$i]>nb) の値が nb より大きい場合は、
{print;next} 行を印刷して次の行に移動します。


行のみを表示nb

awk -v nb=3 '
{
    max = 0
    delete a
    for ( i=1 ; i<=NF ; i++ )
        ++a[$i]
    for( j in a )
        max = a[j]>max ? a[j] : max
    if ( max == nb )
        print
}' infile

答え2

AWKを使用:

awk -v t=2 '{for (i=1; i<=NF; i++) c[$i]++; for (v in c) if (c[v] == t) {print; next}}'

これは、各行を処理し、各行内で連想配列の各値(各フィールド)の発生回数を計算し、表示されるすべての値を繰り返し、cそのvうちの1つが必要な回数だけ表示された場合(指定)t、ラインを何度も印刷しないように、ラインを印刷して次のラインにジャンプします(例えばのための01 01 03 03)。

答え3

これにより、スペースで区切られた単語が繰り返される行だけが印刷されます。

while IFS='' read -r line ; do  if [[ "`echo $line | tr ' ' '\n'| sort | uniq -d`" != '' ]]; then echo "$line"; fi; done < YOURFILE

あなたの例では、出力は次のようになります

01 01 03

01 01 01 03

ここで、2行と3行で「01」が複数回表示される場合...

単語が繰り返されるかどうかを確認する回数を指定するには、次の手順を実行します。

NO=3; lnr=1 ; while IFS='' read -r line ; do echo "for line" $lnr ; echo $line | tr ' ' '\n' | uniq -c| grep -e "^\s*$NO" ; ((lnr++)); done < YOURFILE

あなたの例では、出力は次のようになります。

1号線の場合

2号線

3号線

 3 01

NO最初の数字は、確認する変数に指定した発生回数です。
2番目の数字は、重複していないことが判明した実際の単語です。
もちろん、YOURFILEをあなたのファイルに変更してください。

関連情報