使用sed / awk删除冗余行

时间:2013-10-08 21:08:53

标签: bash sed awk

我有一个包含大约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

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

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

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

    THX

2 个答案:

答案 0 :(得分:6)

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

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

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

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

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

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

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

答案 1 :(得分:4)

编辑后,我想你想要

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

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