【问题标题】:print column with unique value打印具有唯一值的列
【发布时间】:2019-01-06 07:00:14
【问题描述】:

我在一个文本文件中有 2 列。我想打印与重复列关联的所有不同值。

VZTFARATGJBBCEGIM01 RGROUP-GIMAGES
VZTFARATGJBFFEGIM01 RGROUP-GIMAGES
VZTFARATGJBSTEGIM01 RGROUP-GIMAGES
VZTFARATGJBBCE024701 RGROUP-ENV0247
VZTFARATGJBFFE024701 RGROUP-ENV0247
VZTFARATGJBSTE024701 RGROUP-ENV0247
VZTFARATGOD11E024701 RGROUP-ENV0247
GROUP-ENV0247
VZTFARATGJBBCE024701
VZTFARATGJBFFE024701
VZTFARATGJBSTE024701
VZTFARATGOD11E024701

GROUP-GIMAGES
VZTFARATGAWSTEGIM01
VZTFARATGENTFEGIM01
VZTFARATGJBBCEGIM01
VZTFARATGJBFFEGIM01

【问题讨论】:

  • 这是否也只能使用 awk 或命令行来完成?
  • 任何解决方案都是可行的。抱歉,类型文件包含 2 列
  • 请将该示例输入的所需输出添加到您的问题中。
  • Vijay Verma 我更新了我的答案,只在你想要的输出中使用 awk,我还添加了它在做什么的解释。
  • @Cyrus 看起来解决方案类似于这里的这个问题stackoverflow.com/questions/30179431/…

标签: awk sed


【解决方案1】:

这是 awk 中的解决方案。

awk -F'[ ]' '{ b[$2]=b[$2]  $1 "\n" } END { for (c in b) { print c; print b[c] }}' test.txt

其中 test.txt 包含值:

VZTFARATGJBBCEGIM01 RGROUP-GIMAGES 
VZTFARATGJBFFEGIM01 RGROUP-GIMAGES 
VZTFARATGJBSTEGIM01 RGROUP-GIMAGES 
VZTFARATGJBBCE024701 RGROUP-ENV0247 
VZTFARATGJBFFE024701 RGROUP-ENV0247 
VZTFARATGJBSTE024701 RGROUP-ENV0247 
VZTFARATGOD11E024701 RGROUP-ENV0247

输出如下:

RGROUP-ENV0247
VZTFARATGJBBCE024701
VZTFARATGJBFFE024701
VZTFARATGJBSTE024701
VZTFARATGOD11E024701

RGROUP-GIMAGES
VZTFARATGJBBCEGIM01
VZTFARATGJBFFEGIM01
VZTFARATGJBSTEGIM01

以及它是如何工作的:

awk -F'[ ]'   // deliminate on empty space
'{ 
    // add value to associated array and append with newline
    b[$2]=b[$2]  $1 "\n"
} 
END { 
  // print out each 'key', and their respective values
  for (c in b) { 
    print c; print b[c] 
  }
}' 
test.txt      // file to read from 

【讨论】:

  • 如果它适合你,你可以在这里投票。今后也请避免修改答案,除非它们添加到提供的解决方案中。
【解决方案2】:

使用 GNU awk 和 2D 数组清除 $1 中的重复项:

$ awk '{
    a[$2][$1]           # hash to a. This weeds out duplicates in $1
}
END {
    for(i in a) {       # all groups
        print i         # output name
        for(j in a[i])  # all group members
            print j     # output member
        print ""        # empty line after each group
    }
}' file

输出:

RGROUP-ENV0247
VZTFARATGOD11E024701
VZTFARATGJBSTE024701
VZTFARATGJBBCE024701
VZTFARATGJBFFE024701

RGROUP-GIMAGES
VZTFARATGJBBCEGIM01
VZTFARATGJBSTEGIM01
VZTFARATGJBFFEGIM01

另一个用于非 GNU awks。使用match测试a[$2]是否有重复:

$ awk '
{
    if(!match(a[$2],"(^|\n)" $1 "($|\n)"))
    a[$2]=a[$2] "\n" $1
}
END {
    for(i in a) {
        print i a[i]
        print ""
    }
}

最后会有一个空行。

【讨论】:

  • 不错的答案,不知道 [$2][$1] 有助于提高独特性。打算投票赞成你的反对我的:D
猜你喜欢
  • 2011-09-11
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多