我有一个庞大的文件,大约有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?还是这是错误的做法?
编辑
我想我想做的是。。。
使用awk遍历每一行,如果cbin1>cbin2则交换字段。
排序myfile | uniq
这是我不知道该怎么做的第一部分。
谢谢

最佳答案

如果你总是同时拥有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中重新排序的列将破坏顺序。

关于bash - 使用sed/awk删除多余的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19258464/

10-09 21:42