保留一对中的一个成员

时间:2016-04-11 16:36:02

标签: linux bash awk duplicates

大家下午好,

我有一个包含两个字段的文件,每个字段代表一对成员。 我想保留每对中的一个成员,并且哪个成员是重要的,因为这些是研究中的重复样本的代码。

每对在我的文件中出现两次,该对中的每个成员在任一列中出现一次。

输入文件的示例是:

XXX1 XXX7 XXX2 XXX4 abc2 dcb3 XXX7 XXX1 dcb3 abc2 XXX4 XXX2

所需输出的一个例子是

XXX1
XXX2
abc2

如何在bash中实现这一目标?谢谢。

2 个答案:

答案 0 :(得分:2)

以下是GNU awk,剪切和排序的组合,将scipt存储为duplicatePairs.awk

    { if ( $1 < $2) print $1, $2
      else print $2, $1
    }

并按照以下方式运行:awk -f duplicatePairs.awk your_file | sort -u | cut -d" " -f1

if对这些对进行排序,使得带有x,y的行和带有y,x的行打印相同。然后sort -u可以删除重复的行。 cut选择第一列。

使用稍微大一点的awk脚本,我们可以解决要求&#34; awk-only&#34;:

    { 
     smallest = $1;
     if ( $1 > $2) {
        smallest = $2
     }

     if( !(smallest in seen) ) {
        seen [ smallest ] = 1
        print smallest
     }
    }

运行方式如下:awk -f duplicatePairs.awk your_file

答案 1 :(得分:0)

虽然Lars上面发布的答案非常有效但我想建议一个替代方案,以防万一有人偶然发现这个问题。

我以前曾使用xpathSApply(a,"//table[contains(.,'Name and Principal|Principal Position|another string')]") 来获得相同的结果。我没有意识到它有效,因为我文件中的行数没有减半。结果是因为我对我的数据做了一些错误的假设。