-5

我有这样的输入:

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
...
...
4

2 回答 2

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 的评论更新

$ 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
于 2013-08-16T13:03:17.427 回答
2

这可能对您有用(GNU sed):

sed -r ':a;$!N;s/^((.*)\s+\S+)\s*\2\s+/\1/;ta;P;D' file
于 2013-08-17T10:35:15.443 回答