Su ejemplo sugerido (a continuación) no funciona porque en realidad estaría leyendo y escribiendo en el mismo archivo simultáneamente.
$ cat filename | sort | uniq > filename
La idea con una tubería o redirección es que el comando en el lado izquierdo y derecho de cada tubería o redirección se ejecute simultáneamente, en paralelo. El comando de la derecha procesa la información a medida que se le entrega desde el comando de la izquierda, mientras que el comando de la izquierda todavía se está ejecutando.
Para que su escenario funcione, el comando que lee del archivo debería finalizar antes de que comience el comando que escribe en el archivo. Para que esto funcione, primero debe redirigir la salida a una ubicación temporal, luego, una vez que haya terminado, envíela desde la ubicación temporal nuevamente al archivo.
Una mejor manera de hacer esto es básicamente como en su ejemplo anterior, donde redirige a un archivo temporal y luego cambia el nombre del archivo al original (excepto que no necesita eliminar el archivo primero, porque al moverlo se elimina cualquier objetivo existente) .
$ cat filename | sort | uniq > result
$ mv -f result filename
También puede guardarlo en una variable de cadena, excepto que solo funciona cuando los datos son lo suficientemente pequeños como para que quepan todos en la memoria a la vez.
echo $(cat filename | sort | uniq > result) > filename
o algo ? De paso, no tengo tiempo para probarlo.