具有 3 列的示例输入数据,第一列和第三列具有重复值,需要唯一地打印它们及其重复计数。
sort -u 在某种意义上确实有帮助,但无法打印与第一列和第三列相关的重复值的出现。
Input :
3210 -06:00 5172 -06:00 3335 -07:00 3258 -05:00 B 3322 -05:00 B 5097 -05:00 C 3238 -06:00 C 5364 -05:00 C 3366 -06:00 C 3293 -06:00
输出 :
甲(2)-06:00 甲(1)-07:00 一(1)-05:00 乙(2)-05:00 中(3)-06:00 中(1)-05:00
或者
输出 :
A 2 -06:00 A 1 -07:00 A 1 -05:00 乙 2 -05:00 C 3 -06:00 中1 -05:00
答案1
不完全是您想要的格式,但符合所有其他要求:
awk '{print $1" "$3}' <inFile> | sort | uniq -c
在英语中,使用 awk 仅打印第一列和第三列,然后排序,然后使用 count 进行 uniq。
答案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
。
该代码将输入的第一个和第三个字段作为一对一起出现的次数存储在数组中count
(以第一个和第三个字段作为索引)。最后,我们循环遍历数组的索引,将它们分成原始的第一和第三字段(分别为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
要交换前两列:
$ 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