ファイルには5つの数値列が含まれています。
例:
12 34 67 88 10
4 90 12 10 7
33 12 5 76 34
同じ数字を印刷して何回印刷されるかを確認したい。例:
3 : 12
2 : 34
答え1
このawk
スクリプトは、例に示すように出力を印刷します。
awk '{
for ( i=1; i<=NF; i++ ) # loop over all fields/columns
dict[$i]++; # count occurrence in an array using the field value as index/key
}
END { # after processing all data
for (key in dict) # iterate over all array keys
if(dict[key]>1) # if the key occurred more than once
print dict[key] " : " key # print counter and key
}' inputfile
たとえば、入力、出力は次のようになります。
2 : 10
3 : 12
2 : 34
条件を削除すると、if(a[i]>1)
一度だけ表示される番号も一覧表示されます。
発生回数の降順で結果を並べ替えるには、次を追加します。
| sort -nr
これは、数値の逆順にソートすることを意味します。
したがって、awk
上記のコマンドはソートと組み合わせられます。
awk '...' inputfile | sort -nr
生産する
3 : 12
2 : 34
2 : 10
for
Glenn jackmanのコメントで述べたように、PROCINFO["sorted_in"] = "@val_num_desc"
ブロックの上にを追加して処理中に配列値をソートするようにGNU AWKに指示できますEND
。
END { # after processing all data
# In GNU AWK only you can use the next line to sort the array for processing
PROCINFO["sorted_in"] = "@val_num_desc" # sort descending by numeric value
for (key in dict) # iterate over all array keys
if(dict[key]>1) # if the key occurred more than once
print dict[key] " : " key # print counter and key
}
このGNU固有の拡張機能を使用するとsort
。
答え2
パイプが利用可能
tr -s ' ' '\n' < datafile | sort | uniq -c -d
目的の回答の正確さに基づいて値をフィルタリングできます。-d
数が1より大きい値だけでなく、すべての値を表示するには削除してください。
答え3
これは次のようによく似ています。@roaimaの返信しかし、sed
計算時に出力で複数のスペースを避けることができます。
$ sed -E 's/ +/\n/g' file | sort | uniq -c -d
2 10
3 12
2 34
そして、数字で並べ替えて追加するには、次のように:
します。
$ sed -E 's/ +/\n/g' file | sort | uniq -c -d |
sort -rn | sed -E 's/([0-9]) /\1 : /'
3 : 12
2 : 34
2 : 10
または:
$ grep -oP '\d+' file | sort | uniq -c -d |
sort -rn | sed -E 's/([0-9]) /\1 : /'
3 : 12
2 : 34
2 : 10
または以下を使用してperl
:
$ perl -lae '$k{$_}++ for @F;
END{
@keys = grep { $k{$_} > 1 } keys(%k);
@keys = sort { $k{$b} <=> $k{$a} } @keys;
print "$k{$_} : $_" for @keys
}' file
3 : 12
2 : 10
2 : 34
または全体的な単純さを好む場合:
$ perl -lae '$k{$_}++for@F}{print"$k{$_} : $_"for sort{$k{$b}<=>$k{$a}}grep{$k{$_}>1}keys(%k)' file
3 : 12
2 : 10
2 : 34
答え4
注文する:
sed "N;s/\n/ /g" filename | sed "N;s/\n/ /g"| perl -pne "s/ /\n/g"| sed '/^$/d'| awk '{a[$1]++}END{for(x in a){print x,a[x]}}'|awk '$2 >1 {print $0}'
出力
sed "N;s/\n/ /g" i.txt | sed "N;s/\n/ /g"| perl -pne "s/ /\n/g"| sed '/^$/d'| awk '{a[$1]++}END{for(x in a){print x,a[x]}}'|awk '$2 >1 {print $0}'
10 2
12 3
34 2