Por palabra, me refiero a cualquier espacio en blanco cadena delimitada.

Supongamos que el archivo test.txt tiene las siguientes palabras delimitado por espacios:

hello hello hello hell osd
hello
hello 
hello
hellojames beroo helloooohellool axnber hello
way
how 

Quiero contar el número de veces que la palabra hola aparece en cada línea.

He utilizado el comando awk -F "hello" '{print NF-1}' test.txt para mostrar el número de ocurrencias de la palabra hola en cada línea:

3
1
1
1
4
0
0

Por lo que encontrar un total de 3+1+1+1+4 = 10 las apariciones.

El problema está en la cuarta línea: hola se produce sólo 1 vez como una palabra independiente; palabras como hellojames y helloooohellool no debe ser contada porque hola no está delimitado por espacios en blanco.

Así que quiero es encontrar 7 apariciones de hola como una palabra independiente.

Me puede ayudar a escribir un comando que devuelve el correcto total de 7 veces?

  • ¿Necesita el número de ocurrencias en cada línea, o simplemente el total?
  • Sólo necesito un total de
InformationsquelleAutor user1304473 | 2012-05-15

7 Comentarios

  1. 6
    awk '{ for(i=1; i<=NF; i++) if($i=="hello") c++ } END{ print c }' file.txt

    Si usted necesita para imprimir cada línea:

    awk '{ c=1; for(i=0; i<=NF; i++) if($i=="hello") c++; print c }'
    • gracias funciona .
    • En realidad, la tercera línea, Después de este «hola», se esconde un espacio en blanco detrás de este alboroto, así que cuando me cuenta que, hola[espacio] nextline, lo que significa que este es un hola[espacio] en lugar de tan solo un «hola» palabra funciona, gracias
    • Lo siento, off-by-one; los campos de ir de 1 NF. No sé por qué la tercera línea está apagado, tal vez usted tiene un divertido no impresión personaje en ella.
  2. 3
    grep -o '\<hello\>' filename | wc -l

    La \< y \> bits son los límites de las palabras de los patrones, por lo que la expresión no encontrar foohello o hellobar.

    También puede utilizar awk -F '\\<hello\\>' ... para lograr el mismo efecto.

    • Que funciona , gracias
  3. 2

    Solución:

    sed 's/\s\+/\n/g' test.txt | grep -w hello  | wc -l

    Explicación:

    sed 's/\s\+/\n/g' text.txt

    Esto reemplaza cada tramo de los espacios en blanco con una nueva línea, de manera efectiva, volver a formatear el archivo test.txt por lo que tiene una palabra por línea. El comando sed 's/FIND/REPLACE/g' sustituye a la FIND patrón con REPLACE en todas partes aparece. El patrón de \s\+ significa «uno o más caracteres de espacio en blanco», y \n es una nueva línea.

    grep -w hello

    Este extractos sólo aquellas líneas que contienen hello como una palabra completa.

    wc -l

    Esta cuenta el número de líneas.


    Si usted desea contar el número de ocurrencias por línea, usted puede usar la misma técnica, pero el proceso de una línea a la vez:

    while read line; do
      echo $line | sed 's/\s\+/\n/g' | grep -w hello  | wc -l
    done < test.txt
  4. 0
    for word in `cat test.txt`; do
      if [[ ${word} == hello ]]; then
        helloCount=$(( ${helloCount} + 1));
      fi;
    done;
    
    echo ${helloCount} 
    • UUoC! partmaps.org/era/unix/award.html (También UUo${} pero no he encontrado un sitio web para que aún). 🙂
    • Eso no va a funcionar. Él quiere un recuento por línea. Replica el comportamiento de grep -c (es decir, que se cuenta por archivo).
    • Esto no es un UUoC. Gato es necesaria para la for-loop para que funcione correctamente. Él es esencialmente ganas de leer el archivo a la cerveza negra, que su enlace explícitamente a los estados es un uso válido de gato.
    • Lo que está mal con for word in $(<test.txt); do ?
    • Awww snap! Me olvidé de que la sintaxis. Touche buen señor. Touche.
    • ((helloCount += 1)) o ((helloCount++))

  5. 0
    cat $FileName | tr '[0]' '[2]' | grep $word | wc -l

    Este Comando cambiará espacio en la nueva línea, a continuación, fácilmente puede grep palabra y contar el número de líneas son aquellos que contienen palabra dada.

  6. 0

    Sólo cambiar la «aguja» y el «archivo»

    #!/usr/bin/env sh
    
    needle="|"
    file="file_example.txt"
    
    IFS=$'\n'
    
    counter=0
    for line in `cat $file`
    do
        counter=$[$counter+1]
        echo $counter"|"`echo $line | grep -o "$needle" | wc -l`
    done

    Se imprimirá el número de línea y el número de ocurrencias, separados por un carácter de canalización

Dejar respuesta

Please enter your comment!
Please enter your name here