¿Cómo puedo redirigir las líneas coincidentes a un archivo y las líneas no coincidentes a un archivo diferente?

13

¿Hay un script / programa / utilidad ya disponible para el siguiente requisito de manera optimizada?

someCommand |
   tee >(grep "pattern" > LinesWhichMatch) |
   grep -v "pattern" > LinesWhichDoesNotMatch
balki
fuente

Respuestas:

16

Podrías usar awkpara eso.

command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'
Chris Down
fuente
1
No estoy completamente familiarizado, awkpero ¿en qué punto evalúa el >? Si se evalúa cada vez se aplica el condicional, que acabaría con dos archivos de una sola línea ...
Shadur
1
@Shadur >imprime todos los resultados en el archivo, sobrescribiendo los archivos existentes. No se evalúa de tal manera que dará como resultado que las líneas nuevas sobrescriban la salida anterior de la misma instancia de awk. Es decir, si hay varias coincidencias, el archivo "coincidencia" contendrá cada coincidencia separada por OFS. La diferencia entre >y >>existe en el tratamiento de archivos existentes.
Chris Down
10

Aquí hay un sedejemplo:
Nota: el wcomando de sed sobrescribirá un archivo existente cada vez que se ejecute el script, pero solo si se activa ese comando de escritura en particular; por lo tanto, larm

rm -f file-{yes,not}  
sed -ne '/pattern/bY; w file-not' -e 'b; :Y; w file-yes' file
Peter.O
fuente
Agradable. Sin ramificación:sed -n '/PATTERN/p;//! w file-not' infile >file-yes
don_crissti
6

Puede agregar archivos en awk:

awk '{if (/pattern/) print >>"matched"; else print >>"unmatched"; }

o más corto:

awk '{print >>(/pattern/?"matched":"unmatched")}'
Michał Šrajer
fuente
Su ejemplo muestra que quiere sobrescribir los archivos si existen, no agregarlos.
Chris Down