【问题标题】:remove lines based on value of two columns根据两列的值删除行
【发布时间】:2016-09-02 01:11:37
【问题描述】:

我有一个大约 8,000,000 行的大文件 (my_file.txt),如下所示:

1   13110   13110   rs540538026 0   NA  -1.33177622457982
1   13116   13116   rs62635286  0   NA  -2.87540758021667
1   13118   13118   rs200579949 0   NA  -2.87540758021667
1   13013178    13013178    rs374183434 0   NA  -2.22383195384362
1   13013178    13013178    rs11122075  0   NA  -1.57404917386838

我想根据前三列找到重复项,然后删除第 7 列中值较低的行,我可以完成的第一部分:

awk -F"\t" '!seen[$2, $3]++' my_file.txt

但我不知道如何删除具有较低值的重复项,所需的输出将是这个:

1   13110   13110   rs540538026 0   NA  -1.33177622457982
1   13116   13116   rs62635286  0   NA  -2.87540758021667
1   13118   13118   rs200579949 0   NA  -2.87540758021667
1   13013178    13013178    rs11122075  0   NA  -1.57404917386838

速度是个问题,所以我可以使用 awk、sed 或其他 bash 命令 谢谢

【问题讨论】:

    标签: bash awk sed


    【解决方案1】:
    $ awk '(i=$1 FS $2 FS $3) && !(i in seventh) || seventh[i] < $7 {seventh[i]=$7; all[i]=$0} END {for(i in a) print all[i]}' my_file.txt
    1   13013178    13013178    rs11122075  0   NA  -1.57404917386838
    1   13116   13116   rs62635286  0   NA  -2.87540758021667
    1   13118   13118   rs200579949 0   NA  -2.87540758021667
    1   13110   13110   rs540538026 0   NA  -1.33177622457982
    

    感谢@fedorqui 提供的高级索引。 :D

    解释:

    (i=$1 FS $2 FS $3) && !(i in seventh) || $7 > seventh[i] { # set index to first 3 fields 
                       # AND if index not yet stored in array 
                                          # OR the seventh field is greater than the previous value of the seventh field by the same index:
        seventh[i]=$7                     # new biggest value
        all[i]=$0                         # store that record
    } 
    END {
        for(i in all)                     # for all stored records of the biggest seventh value
            print all[i]                  # print them
    }
    

    【讨论】:

    • 您能解释一下@JamesBrown 命令的作用吗?感谢您的回答
    • seen 是该数组的错误名称。习惯上,我们总是使用数组名称seen 来表示只是一组已经看到的索引,而不是作为计数或最大值或其他任何东西的数组。在这种情况下,您的数组名称应为 max
    • 修复了seen
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 2019-02-24
    • 1970-01-01
    相关资源
    最近更新 更多