使用sed/awk删除冗余行

Ste*_*son 2 bash awk sed

我有一个包含大约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
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,文件可能是它需要的两倍大,因为预期/观察到的数据字段对于bin1是相同的:bin2与bin2相同:bin1即1:5具有与5:1相同的值.

编辑

所以行9581看起来像这样

..       ..    ..     ..                       ..
9581     6      1     9.20637e-05              4
Run Code Online (Sandbox Code Playgroud)

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

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

  1. 使用awk遍历每一行,如果cbin1> cbin2交换字段.
  2. sort myfile | uniq的

这是我不知道该怎么做的第一部分.

谢谢

Pau*_*and 6

如果你总是同时拥有bin1:bin2和bin2:bin1那么你可以这样做:

awk '/^[0-9]/ && $3>=$2' file
Run Code Online (Sandbox Code Playgroud)

这将打印出第三列在数字上大于第二列的任何行,因此将打印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
Run Code Online (Sandbox Code Playgroud)

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