Here the problem was solved with a different perspective. You may find other solutions but what made this interesting to me was transforming one problem into another. Here is how:

Assume we have a set of pairs:
```
SeedRandom[75];

pairs = RandomInteger[{0, 3}, {20, 3}];

n = Length[pairs];
```

pairs that have at least two similar axes will be associated for each pair, we can find them by:
```
Position[pairs, 
 Alternatives @@ 
  Table[ReplacePart[SOMEPAIR, i -> _], {i, 3}], {1}]
```

If we extend this code further, we could build an `AdjacencyMatrix` in which we want to select a minimum set of nodes that are never incident to the same edge (like [`FindIndependentVertexSet`](http://reference.wolfram.com/language/ref/FindIndependentVertexSet.html) but in minimum terms):

```
graphRules = 
  DeleteDuplicatesBy[Sort]@
   Catenate@
    Table[Thread[
      index \[UndirectedEdge] 
       Catenate@
        Position[pairs, 
         Alternatives @@ 
          Table[ReplacePart[pairs[[index]], i -> _], {i, 
            3}], {1}]], {index, Length@pairs}];

adjacency = Unitize@AdjacencyMatrix[graphRules];
```

Showing the graph:

```
Graph[graphRules]
```

[![enter image description here][1]][1]


Now we find the vertex set:

```
result = LinearOptimization[
  ConstantArray[1,n],
 {Join[DiagonalMatrix@ConstantArray[1, n], adjacency], 
   Join[ConstantArray[0, n], ConstantArray[-1, n]]}, Integers]
```

Highlighting the vertex set:

```
HighlightGraph[graphRules, 
 VertexList[graphRules][[Catenate@Position[result, 1]]]]
```

[![enter image description here][2]][2]


The red vertices in the above graph are the pairs you're looking for, or more precisely these pairs:

```
pairs[[VertexList[graphRules][[Catenate@Position[result, 1]]]]]

(* Out: {{2, 3, 0}, {1, 2, 0}, {3, 0, 2}, {2, 1, 1}, {0, 1, 2}, {1, 1, 3}} *)
```


  [1]: https://i.sstatic.net/0wx4x.png
  [2]: https://i.sstatic.net/vZ9Eg.png