重複(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をあなたのファイルに変更してください。