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
与えられた入力する
cut
、および:をsort
使用してください。uniq
sed
cut -d ' ' -f1,3 Input | sort | uniq -c | sed 's/^ *//;s/^\([0-9]*\) \([^ ]*\)/\2 \1/'
使用
datamash
とsed
: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