一部の列データの固有値と重複値の数を印刷する最も簡単なコマンド

一部の列データの固有値と重複値の数を印刷する最も簡単なコマンド

3列、1列目、3列目のサンプル入力データには重複値があるため、重複回数と一意に印刷する必要があります。

sort -uはある意味では役に立ちますが、最初と3番目の列に関連する重複値の発生を印刷しません。

Input :
3210 -06:00
5172 -06:00
3335 -07:00
3258 -05:00
B3322 -05:00
B5097 -05:00
ㄷ3238 -06:00
ㄷ5364 -05:00
ㄷ 3366 -06:00
ㄷ 3293 -06:00

出力:

A(2)-06:00
A(1)-07:00
仕事(1)-05:00
B(2)-05:00
中(3)-06:00
中(1)-05:00

または

出力:

ああ2 -06:00
ああ1 -07:00
ああ1 -05:00
地下2階 -05:00
すべて3 -06:00
中 1 -05:00

答え1

正確に望む形式ではありませんが、他のすべての要件を満たしています。

awk '{print $1" "$3}' <inFile> | sort | uniq -c

英語では、awkを使用して最初と3番目の列のみを印刷してソートし、uniqにcountを使用します。

答え2

$ awk '{ count[$1,$3]++ } END { for (i in count) { split(i, field, SUBSEP); printf("%s(%d)%s%s\n", field[1], count[i], OFS, field[2]) } }' file
A(1) -07:00
B(2) -05:00
A(2) -06:00
A(1) -05:00
C(3) -06:00
C(1) -05:00

出力がソートされない可能性があります。必要に応じて渡してくださいsort

このコードは、入力の最初と3番目のフィールドが配列のペアとして一緒に表示される回数を格納しますcount(最初と3番目のフィールドにインデックスが付けられます).最後に、配列のインデックスを繰り返して元の最初のフィールドと3番目のフィールド(field[1]およびそれぞれfield[2])に分割し、必要な形式の数で出力します。


代替フォーマット:

入力ファイルがフィールド区切り文字として単一のスペースを使用する場合(そうでない場合は次を使用awk '{ print $1,$3 }'cut

$ cut -d ' ' -f 1,3 file | sort | uniq -c
   1 A -05:00
   2 A -06:00
   1 A -07:00
   2 B -05:00
   1 C -05:00
   3 C -06:00

最初の 2 つの列を置き換えるには:

$ cut -d ' ' -f 1,3 file | sort | uniq -c | awk '{ print $2, $1, $3 }'
A 1 -05:00
A 2 -06:00
A 1 -07:00
B 2 -05:00
C 1 -05:00
C 3 -06:00

答え3

  1. 与えられた入力するcut、および:をsort使用してください。uniqsed

    cut -d ' ' -f1,3 Input | 
    sort | uniq -c | 
    sed 's/^ *//;s/^\([0-9]*\) \([^ ]*\)/\2 \1/'
    
  2. 使用datamashsed:

    datamash -t ' ' -g1,3 -s countunique 2 < Input | 
    sed 's/\(.*\) \(.*\) \(.*\)/\1 \3 \2/'
    

出力:

A 1 -05:00
A 2 -06:00
A 1 -07:00
B 2 -05:00
C 1 -05:00
C 3 -06:00

関連情報