我有一个庞大的文件,大约有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/