Usando un script awk, ¿cómo cuento la cantidad de campos en los que se encuentra una subcadena en un archivo?

Por ejemplo, tengo el documento de texto:

"Hello, I am the janitor and I have a headache The rabbit jumped over the red brick wall" 

Quiero contar el número de campos en los que aparece la subcadena «él». No quiero contar el número de «él» en el archivo, solo el número de campos.

Entonces, para mi ejemplo, debería imprimir algo como esto:

Number of fields that contain "he" in record #1: 3 Number of fields that contain "he" in record #2: 2 

Tiene que ser un script awk.

Comentarios

  • ¿Qué ha probado hasta ahora?
  • He probado el siguiente script: " {print " Número de campos en el registro # " NR " que contiene ' he ': " índice ($ 0, " él ")} y no ' no funciona. También probé gsub, pero gsub cuenta cada aparición de ' he ', no solo los campos en los que ' se encuentra '.
  • Necesita iterar sobre los campos. Esto debería ayudarlo.
  • ¿Ha abandonado unix.stackexchange.com/questions / 550529 / … ?
  • @JohnMike también, por favor ingrese sus intentos & sus resultados en su pregunta , donde no ' no se pasarán por alto.

Respuesta

Los campos están numerados comenzando por 1 y NF contiene el número de ellos. Entonces podemos iterar sobre ellos con for (i = 1; i <= NF; i++) { ... }, con $i dentro del bucle refiriéndose al campo en cuestión. (i es en realidad solo el número del campo, necesitamos el operador $ para obtener el contenido real del campo).

Y en cuanto a encontrar si un valor contiene una subcadena en particular, usar una expresión regular es más fácil. s ~ /foo/ vería si la variable s coincide con la cadena foo en cualquier lugar, es decir, si contiene como una subcadena. Ahora, es posible que también desee hacer coincidir una letra mayúscula, en cuyo caso, por ejemplo, [Ff] funcionaría en lugar de f. El grupo de corchetes [...] coincide con cualquiera de los caracteres del interior.

Por supuesto, también necesitará un contador, pero eso es fácil, solo inicialice una variable a cero antes del bucle (por ejemplo, count=0) e incrementar si hay «una coincidencia (count += 1).

~ ~

Entonces, básicamente, un script awk para ejecutar algún código para cada línea / registro de un archivo es solo

awk "{ some code }" < filename.txt 

Dentro del bloque de código, el bucle for encaja, y también toma un bloque entre llaves { .. }.

awk "{ for ( ... ) { some code } }` 

Y un if funciona de manera similar,

if (condition) { some code... } 

(En realidad, se ven simplemente como for y if en C.)

Y puede usar punto y coma para separar declaraciones, entonces

awk "{ what to do before the loop; for ( ... ) { some code }; what to do after }` 

Comentarios

  • ¿Cómo se vería eso como un archivo de script completo? I m en una pérdida completa. Nuestro profesor no ' no habló de estas cosas.
  • @JohnMike, bueno, eso ' es lo que necesita , Realmente odio dar respuestas completas para la tarea. Sin embargo, eso debería abarcar todas las piezas, si tienes tiempo para intentar construir algo con ellas.
  • No ' t, y normalmente No pediría ' respuestas completas, pero me preocupa sacar una A en esta clase. Yo ' soy un estudiante sobresaliente y normalmente no tengo ningún problema con mis clases de ciencias de la competencia, pero este profesor es conocido por esperar conocimientos fuera de clase. ' nunca he usado unix / linux antes, y estoy realmente luchando aquí. La tarea consiste en 20 problemas, y estos 3, más 2 en otra publicación que hice, son los únicos que no puedo ' resolver. Me estoy quedando sin tiempo, ' vence mañana.
  • @JohnMike, ¿intenta si puede juntar algunas piezas?SE apesta para la depuración interactiva de ida y vuelta, pero puede editar su Q para agregar un script si avanza uno o dos pasos, y luego podemos ver qué ' es el stopper
  • @JohnMike Considerando (a) la forma que se muestra aquí para iterar sobre los campos de cada registro usando el bucle for, (b) gsub que ha probado en tu publicación abandonada puede aceptar un objetivo para realizar, es decir, gsub("he","",$i) (c) tienes una experiencia básica en ciencias de la competencia (d) puedes usar herramientas en línea como tutorialspoint.com/execute_bash_online.php para hacer su tarea incluso si no tiene Linux en su PC, entonces no hay ninguna excusa fuerte para no intentar resolver su tarea con la ayuda que se brinda aquí. Al menos inténtelo y llegará la ayuda.

Respuesta

Hecho por el siguiente script awk

awk -v i="he" "{print "Number of fields that contain" " " i " " gsub("he",$0) " " "in record " NR}" file 

salida

Number of fields that contain he 3 in record 1 Number of fields that contain he 2 in record 2 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *