比较行并为相同的行打印相同的值

时间:2013-08-16 12:59:34

标签: r perl awk

我有这样的输入:

A  118791136  X 
A  118791136  x 
A  118791136  X 
A  118791136  X 
B  118791136  x 
B  23456433   X 
B  23456433   X
B  23456433   x
.
.
.

我想将其转换为输出,如:

A  118791136  XxXXx
B  23456433   XXx
.
.
.

我知道有点perl,但我不知道如何逐行比较

非常感谢您提前

如果我们有

A  118791136  X 
A  23456433   x
B  34222223   X
B  56444233   X  

如何有这样的输出:

A 118791136,23456433 X,x
B 34222223,56444233 X,X
...
...

2 个答案:

答案 0 :(得分:4)

这件作品:

$ awk '{a[$1,$2]=a[$1,$2]$3} END{for (i in a) {print i, a[i]}}' file
B118791136 x
A118791136 XxXX
B23456433 XXx

将结果存储在一个数组中,将第一个和第二个字段作为索引。最后,它打印结果。

结果为B23456433而不是B 23456433,试图将其拆分...... sed使其成为:

$ awk '{a[$1,$2]=a[$1,$2]$3} END{for (i in a) {print i, a[i]}}' file | sed 's/\([A-Z]\)/\1 /'
B 118791136 x
A 118791136 XxXX
B 23456433 XXx

基于sudo_O's comment

的更新
$ awk '{a[$1,$2]=a[$1,$2]$3} END{for (i in a) {split(i,b,SUBSEP); print b[1], b[2], a[i]}}' file
B 118791136 x
A 118791136 XxXX
B 23456433 XXx

根据新评论更新

  

@fedorqui是否可以添加计数器,以某种方式计算数量   列中的相同行?

$ awk '{a[$1,$2]=a[$1,$2]$3} END{for (i in a) {split(i,b,SUBSEP); print b[1], b[2], a[i], length(a[i])}}' file
B 118791136 x 1
A 118791136 XxXX 4
B 23456433 XXx 3

答案 1 :(得分:2)

这可能适合你(GNU sed):

sed -r ':a;$!N;s/^((.*)\s+\S+)\s*\2\s+/\1/;ta;P;D' file