¿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

Respuestas:


16

Podrías usar awkpara eso.

command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'

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

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")}'

Su ejemplo muestra que quiere sobrescribir los archivos si existen, no agregarlos.
Chris Down
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.