根据两列(在两个方向上)删除重复的行,并按第三列排序

时间:2018-03-18 00:00:58

标签: linux bash sorting awk

我想从文件中删除重复的行,如下所示:

A   B   1e-149
A   B   7e-136
A   C   6e-147
A   C   3e-131
B   C   0.0
B   A   4e-150
B   A   1e-136
C   B   0.0
C   A   5e-148
C   A   7e-135

基于第1列和第2列。

到目前为止,我正在尝试:

awk '!a[$1$2]++' file

导致

A   B   1e-149
A   C   6e-147
B   C   0.0
B   A   4e-150
C   B   0.0
C   A   5e-148

但是,我还要删除那些在第2列和第1列中找到字段的行。理想情况下,我希望保留第三列中值最低的那些,从而导致:

B   A   4.00E-150
B   C   0
C   A   5e-148

有没有办法使用awk和/或排序?

1 个答案:

答案 0 :(得分:1)

尝试:

$ sort -g -k3 file | awk '!a[$1$2]++ && !a[$2$1]++' 
B   C   0.0
B   A   4e-150
C   A   5e-148

如何运作

  • sort -g -k3 file

    这会在第3列以数字方式对文件进行排序,以便第3列中的最低值排在第一位。

  • awk '!a[$1$2]++ && !a[$2$1]++'

    这将打印我们之前没有按任何顺序看到前两列的第一行。