我有一个包含大约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部分。
THX
答案 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
...假设字段以制表符分隔,并假设行号不是数据的一部分。