bash - 使用sedawk删除冗余行

bash - 使用sedawk删除冗余行,第1张

我有一个包含大约100万行的大量文件。前6行看起来像这样 - 整个文件已经排序。

      bin1  bin2   expected                 observed
1     1     1      9.83035e-06              1
2     1     2      3.91360e-05              3
3     1     3      1.68648e-05              1
4     1     4      3.95938e-05              1
5     1     5      2.17026e-05              1
6     1     6      9.20637e-05              4

令人惊讶的是,文件的大小可能是它需要的两倍,因为bin1:bin1的预期/观察数据字段相同:bin2:bin1,即1:5具有与5:1相同的值。

修改

因此第9581行看起来像这样

..       ..    ..     ..                       ..
9581     6      1     9.20637e-05              4

因此,我希望在进一步拆分或加载到数据库之前删除冗余行。使用sedawk有一个合理有效的方法吗?或者这是错误的做法?

EDIT 我想我想做的是......

  1. 使用awk遍历每一行,如果cbin1> cbin2交换字段。
  2. 排序myfile | uniq的
  3. 我不知道该怎么做是第1部分。

    THX

    最佳答案:

    2 个答案:

    答案 0 :(得分:6)

    如果总是同时包含bin1:bin2和bin2:bin1,那么您可以执行以下操作:

    awk '/^[0-9]/ && >=' file
    

    这将打印出第三列在数字上大于第二列的任何行,因此将打印1:2而不是2:1。

    注意如果你没有总是同时拥有bin1:bin2和bin2:bin1,那么上述解决方案将丢失数据!

    更新:根据已修改的问题,您可能需要以下内容:

    awk '/^[0-9]/ && > {a=; =; =a} {print}' file | column -t | sort -u
    

    请注意,我们通过列-t管道来重建列,因为awk中的列重新排序会破坏订单。

    答案 1 :(得分:4)

    编辑后,我想你想要

    awk -F '\t' 'BEGIN { OFS=FS }
        > { t=; =; =t } 1' file |
    sort -u >newfile
    

    ...假设字段以制表符分隔,并假设行号不是数据的一部分。

    本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复