Quiero contar el número de partidos que hay en una sola línea (o de todas las líneas, como siempre será sólo una línea).

Quiero contar no sólo un partido por línea como en

echo "123 123 123" | grep -c -E "123" # Result: 1

Mejor ejemplo:

echo "1 1 2 2 2 5" | grep -c -E '([^ ])( ){1}' # Result: 1, expected: 2 or 3
  • es siempre los datos separados por espacios?
  • Siempre hay que ser «uno de los datos», tal vez porque quiero partido 123 123 3 (o 2) veces en 123 123 123 123
  • +1 por la pregunta, -1 para el extraño ejemplo de regex
InformationsquelleAutor Tyilo | 2011-05-30

5 Comentarios

  1. 50

    Usted podría utilizar grep -o luego de la tubería a través de wc -l:

    $ echo "123 123 123" | grep -o 123 | wc -l
    3
    • Mi versión de grep no sabe lo que -o es 🙁
    • Usted necesita preguntar a papá noel para una nueva grep este año. 🙂
    • ¿tienes egrep? Lo mismo iba a funcionar w/ egrep
    • Pennington – gracias, egrep dice lo mismo. Estoy en Windows ahora, así que creo que es esperado.
    • conseguir cygwin, no te arrepentirás
    • eso no es sorprendente, mira a tu regex. Pregunta por 0 o más instancias de otra cosa que un espacio, seguido por un espacio, seguido por la primera cosa que usted emparejado de nuevo. Nota: 0 o más. De hecho, existen cinco de estos partidos en su cadena (suponiendo que no rebobinar después de cada partido). Ellos son: 1) "1 1" (bytes 1-3), 2) " " (es decir, cero casos de algo que no es un espacio, seguido por un espacio, seguido por el mismo cero casos de nuevo – 4 bytes), 3) "2 2" (bytes 5-7), 4) " " (byte 8) y, finalmente, 5) " " (byte 10). Ufff!
    • (Ejecutar sin que el tubo wc -l al final y verás.)
    • Lo que todavía resultados en 2? Su grep -E ejemplo, o que mi respuesta a su pregunta? (Tengo 5 de la antigua, 3 de la segunda.)
    • Este: echo "1 1 2 2 2 5" | grep -o -E '([^ ])( \1){1}' | wc -l
    • Hasta donde yo sé, grep -o no rebobinar en la búsqueda de un partido, por lo que esto sólo partido «1 de 1» (bytes 1-3) y «2 2» (bytes 5-7). No coincidirá con bytes 7-9 («2 2») debido a que por el momento se trata de considerar la posibilidad de bytes a partir del 8 ya consumido bytes 1-7 en los dos partidos anteriores.
    • ¿Por qué echo «1 1 2 2 2 5» | grep -o 2 | wc -l, que da 3 no cumplir su requisito?

  2. 1

    Tal vez debería convertir espacios a saltos de línea primera:

    $ echo "1 1 2 2 2 5" | tr ' ' $'\n' | grep -c 2
    3
  3. 0

    Tal vez a continuación:

    echo "123 123 123" | sed "s/123 /123\n/g" | wc -l

    ( tal vez feo, pero mi bash fu no es grande )

    • Puedo obtener esta salida: 1
    • ¿qué intenta? Estoy consiguiendo 3 de la anterior entrada
    • Copia y pega tu código, pero recuerdo ahora que mi sed no admite \n
  4. 0

    ¿Por qué no usar awk?
    Usted podría utilizar awk '{print gsub(your_regex,"&")}'
    para imprimir el número de partidos en cada línea, o
    awk '{c+=gsub(your_regex,"&")}END{print c}'
    para imprimir el número total de partidos. Tenga en cuenta que la velocidad relativa puede variar dependiendo de la awk aplicación se utiliza, y que hay una entrada.

    • De otra forma, gawk es gawk -v FPAT=your_regex '{print NF}' o gawk -v FPAT=your_regex '{c+=NF}END{print c}', respectivamente.
  5. 0

    Esto podría funcionar para usted:

    sed -n -e ':a' -e 's/123//p' -e 'ta' file | sed -n '$='

    GNU sed podría ser escrito:

    sed -n ':;s/123//p;t' file | sed -n '$='
    • La primera secuencia de comandos no funcionan en GNU sed 4.2.2: «sed: no se puede encontrar la etiqueta para saltar a a'". It seems to work better, if you replace :ta` por :a. Los scripts parece requerir de nueva línea al final de potencia. Además, la secuencia de comandos de salidas de la nada, si no se encuentran coincidencias. Prueba: printf 123 | sed -n ':;s/123//p;t' | sed -n '$=' salidas de la nada.

Dejar respuesta

Please enter your comment!
Please enter your name here