假设你有一个这样的文件:
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 一起作为键