Estoy tratando de seleccionar las líneas que tienen cierto valor en ciertas columna y guardarlo en una salida. Estoy tratando de hacer esto con grep. Es posible?

Mis datos se parece a esto:

apple   5   abcdefd  ewdsf
peach   5   ewtdsfe  wtesdf
melon   1   ewtedf   wersdf
orange  3   qqqwetr  hredfg

Quiero escoger las líneas que tienen un valor de 5 en su 2ª columna y guardarlo en el nuevo outputfile.

apple   5   abcdefd  ewdsf
peach   5   ewtdsfe  wtesdf

Agradecería ayuda!

InformationsquelleAutor user3557715 | 2014-10-01

5 Comentarios

  1. 7

    Es probable que sea posible con grep pero la herramienta adecuada para realizar esta operación es, sin duda awk. Puede filtrar cada línea de 5 en la segunda columna con

    awk '$2 == 5'

    Explicación

    awk divide las entradas en los registros (generalmente) y campos (generalmente una columna) y realizar acciones en los registros que coincidan con ciertas condiciones. Aquí

    awk '$2 == 5'

    es una forma corta para

    awk '$2 == 5 {print($0)}'

    que se traduce en

    For each record, if the second field ($2) is 5, print the full record ($0).

    Variaciones

    Si usted necesita para elegir dinámicamente el valor de la clave utilizada para filtrar los valores, el uso de la -v opción de awk:

    awk -v "key=5" '$2 == key {print($0)}'

    Si usted necesita para mantener la primera línea del archivo, ya que contiene un encabezado de la tabla, utilice el NR variable que lleva la cuenta del número ordinal del registro actual:

    awk 'NR == 1 || $2 == 5'

    La separador de campo es una expresión regular definir el texto que separa las columnas, puede ser modificado con el -F campo. Por ejemplo, si los datos estaban en un básico archivo CSV, el filtro sería

    awk -F", *" '$2 == 5'

    Visitar el la etiqueta wiki para encontrar un par de información útil para empezar a aprender awk.

    • Si la entrada de la tabla tendría una línea de encabezado, ¿cómo podemos conservarla?
  2. 0

    Dar a este un intento:

    grep '^[^\s]\+\s5.*$' file.txt

    el patrón se ve para el comienzo de la línea, seguido por más de un no-espacio de caracteres, seguido por un espacio, seguido por 5, follwed por cualquier número de caracteres, seguido por eol.

    • El .*$ parte es inútil.
    • Punto justo! Son la expresión de la policía?
    • Nunca te esperas la Inquisición española! ☺
  3. 0

    Usted puede conseguir el siguiente comando.

    $ cat data.txt
    apple   5   abcdefd  ewdsf
    peach   5   ewtdsfe  wtesdf
    melon   1   ewtedf   wersdf
    orange  3   qqqwetr  hredfg
    grape   55  kkkkkkk  aaaaaa
    
    $ grep -E '[^ ]+ +5 .*' data.txt > output.txt
    
    $ cat output.txt
    apple   5   abcdefd  ewdsf
    peach   5   ewtdsfe  wtesdf

    Usted puede obtener la respuesta sólo con grep comando.
    Pero le recomiendo que utilice awk comando.

  4. -2

    La forma sencilla de hacerlo es:

    grep '5' MyDataFile

    El resultado:

    apple   5   abcdefd  ewdsf
    peach   5   ewtdsfe  wtesdf

    Para capturar en un archivo nuevo:

    grep '5' MyDataFile > newfile

    Nota: que se encuentra un 5 en cualquier lugar en MyDataFile. Para restringir el acceso a la segunda columna, una breve secuencia de comandos es lo que se adapte a sus necesidades. Si desea limitar a la segunda columna, luego de una rápida secuencia de comandos como la siguiente va a hacer. Uso: script number datafile:

    #!/bin/bash
    
    while read -r fruit num stuff || [ -n "$stuff" ]; do
        [ "$num" -eq "$1" ] && printf "%s  %s  %s\n" "$fruit" "$num" "$stuff"
    done <"$2"

    de salida:

    $ ./fruit.sh 5 dat/mydata.dat
    
    apple  5  abcdefd  ewdsf
    peach  5  ewtdsfe  wtesdf
    • Estoy buscando a restringir a la segunda columna. Lo sentimos, el ejemplo que he publicado fue malo. Hay valores numéricos en otras columnas.

Dejar respuesta

Please enter your comment!
Please enter your name here