¿Cómo puedo combinar varios filtros con sed?

Aquí está mi conjunto de datos

sexo,ciudad,edad 
macho,londres,32 
macho,manchester,32 
macho,oxford,64 
femenino,de oxford,de 23 de 
hembra,londres,33 
macho,oxford,45

Quiero para identificar todas las líneas que contienen MASCULINO Y de OXFORD. Este es mi enfoque:

sed -n '/male/,/oxford/p' file

Gracias

InformationsquelleAutor co7000 | 2015-03-26

3 Comentarios

  1. 4

    Puede asociar un bloque con el primer cheque y poner el segundo en allí. Por ejemplo:

    sed -n '/male/{ /oxford/p; }' file
    

    O invertir la verificación y acción:

    sed '/male/!d; /oxford/!d' file
    

    Sin embargo, ya que (como @Jotne puntos) líneas que contienen female también contienen male y es probable que no desee para que coincida con ellos, los patrones de al menos debe ser modificado para contener los límites de la palabra:

    sed -n '/\<male\>/{ /\<oxford\>/p; }' file
    sed '/\<male\>/!d; /\<oxford\>/!d' file
    

    Pero ya que parece separada por comas de los datos y la verificación no es probablemente significaba para probar si alguien fue a male de la universidad, probablemente sería mejor utilizar una estricta verificación con awk:

    awk -F, '$1 == "male" && $2 == "oxford"' file
    

    Este cheques, no sólo si una línea contiene male y oxford, sino también si están en los campos apropiados. El mismo efecto se puede lograr, algo menos bellamente, con sed mediante

    sed '/^male,oxford,/!d' file
    
    • Esto golpea en female demasiado.
    • OP no decir el campo 1 y campo 2 contiene la palabra, como para obtener líneas con MALE AND OXFORD, sino por su conjunto de datos se debe aceptar.
    • Estoy inferir cosas acerca de la estructura de los datos, que es cierto, pero si mi deducción es correcta, las pruebas de los campos es mucho más sana de la prueba, en mi opinión.
    • sed '/^male,oxford,/!d' file funciona para mí. ¿por qué no trabajar para un archivo csv si el conjunto de datos parece que sex,city,agemale,london,32 male,manchester,32 male,oxford,64 female,oxford,23 female,london,33 male,oxford,45
    • Debe (suponiendo que la puedes incluir varias líneas en donde espero de ellos). ¿Cuál es la salida que se obtiene?
    • Esto es debido a que la prueba para ^male, que es male en el inicio de la línea
    • Ahhh …. es sensible a mayúsculas y minúsculas – im mi conjunto de datos de la ciudad de nombres empiezan con una letra mayúscula. Creo que debo tener en minúsculas mis datos. gracias a todos!!!!!
    • Poner el I bandera en las pruebas: sed '/^male,oxford,/I!d' file. Esto hace que (GNU) sed para que coincida con mayúsculas-minúsculas.
    • no válido código de comando yo
    • Estás usando MacOS X, no?
    • Sí, tengo que hacerlo ……
    • Mac os X viene con BSD sed, que se convierte en doloroso para cualquier cosa más allá de las cosas más básicas. Mi sugerencia es utilizar awk -F, 'tolower($1) == "male" && tolower($2) == "oxford"' file.
    • eso es todo. muchas gracias!!!!!
    • he aquí otro enfoque: 1 paso: en minúsculas todo el conjunto de datos 2. paso: analizar el conjunto de datos awk '{ print tolower($0) }' file | awk -F, '$1 == "male" && $2 == "oxford"'
    • Si no es un problema de que el resultado se convierte a minúsculas, que también funciona, sí.

  2. 1

    Puede utilizar awk

    awk -F, '/\<male\>/&& /\<oxford\>/' file
    male,oxford,64
    male,oxford,45
    

    Utiliza la palabra de anclaje para evitar golpear en la hembra.

  3. 0

    Una sola sed comando comando puede ser usado para resolver esto. Echemos un vistazo a dos de las variaciones de uso de sed:

    $ sed -e 's/^\(male,oxford,.*\)$//;t;d' file
    male,oxford,64
    male,oxford,45
    $ sed -e 's/^male,oxford,\(.*\)$//;t;d' file
    64
    45
    

    Ambos tienen esencialmente el mismo regex:

    ^male,oxford,.*$
    

    Las características más interesantes son la captura de la ubicación del grupo (ya sea la línea entera o sólo la edad de la porción) y el uso de ;t;d para descartar la no coincidencia de las líneas.

    Por hacerlo de esta manera, se puede evitar la necesidad de utilizar awk o grep para resolver este problema.

Dejar respuesta

Please enter your comment!
Please enter your name here