2

我有一个包含大约 1 亿行的庞大文件。前 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:bin2 的预期/观察到的数据字段与 bin2:bin1 相同,即 1:5 与 5:1 具有相同的值。

编辑

所以第 9581 行看起来像这样

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

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

编辑我想我想做的是......

  1. 使用 awk 遍历每一行,如果 cbin1 > cbin2 交换字段。
  2. 排序我的文件 | 独特的

这是我不知道该怎么做的第 1 部分。

谢谢

4

2 回答 2

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

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

于 2013-10-08T21:16:48.017 回答
4

在你的编辑之后,我猜你想要

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

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

于 2013-10-08T21:32:50.513 回答