-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

結果を配列に格納し、1 番目と 2 番目のフィールドをインデックスとして保持します。最後に、結果を出力します。

結果は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 に答える