【问题标题】:compare rows and print the same values for the same rows比较行并为相同的行打印相同的值
【发布时间】:2013-08-18 21:31:47
【问题描述】:

我有这样的输入:

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

【问题讨论】:

    标签: r perl awk


    【解决方案1】:

    这件作品成功了:

    $ 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,但不需要 sed。正确的做法是使用SUBSEP like awk '{a[$1,$2]=a[$1,$2]$3}END{for(k in a){split(k,b,SUBSEP);print b[1],b[2],a[k]}}' file
    • @fedorqui 你能告诉我哪本书,AWK 编程教程可以帮助我学习这些东西吗?
    • @sudo_O uhms,谢谢,我不知道存在这样的选项。更新了!
    • @MaryamSani 我主要是从Stack Overflow 那里学到的,问和答:) 另外,backreference.org/2010/02/10/idiomatic-awk 对一些技巧很有帮助(sudo_O 向我推荐了它)。
    • @MaryamSani 你想看Effective AWK Programming
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      相关资源
      最近更新 更多