根据三列中的两列中的信息保留唯一行

根据三列中的两列中的信息保留唯一行

假设你有一个这样的文件:

NW_006521251.1  428 84134
NW_006521251.1  511 84135
NW_006521038.1  202 84155
NW_006521038.1  1743 84153
NW_006521038.1  1743 84154
NW_006520495.1  198 84159
NW_006520086.1  473 84178
NW_006520086.1  511 84180

我想保留基于第 1 列和第 2 列的唯一行(即不仅仅是第二列,因为该数字可能会在第一列的不同标签下重复)。

这样我就可以得到这个输出(NW_006521038.1 1743从列表中删除第二个重复):

    NW_006521251.1  428 84134
    NW_006521251.1  511 84135
    NW_006521038.1  202 84155
    NW_006521038.1  1743 84153
    NW_006520495.1  198 84159
    NW_006520086.1  473 84178
    NW_006520086.1  511 84180

有没有办法用 awk 来做到这一点?使用uniq file不行。

答案1

有一个“著名的” awk 习惯用法就是为了解决这个问题。你想做:

awk '!seen[$1,$2]++' file

这将创建一个以 2 列为键的关联数组“seen”。使用后递增运算符,以便在您第一次遇到该键时,该值为零。当您第一次看到该键时,请使用否定运算符来获得“真”结果。

答案2

如果您不介意输出已排序:

sort -u -k1,2 file
  • -u- 独特的
  • -k1,2- 使用字段 1 和 2 一起作为键

相关内容