Tengo dos archivos de texto 'simple' y 'simple1' con los siguientes datos en ellos

    simple.txt--

    hello
    hi hi hello
    this
    is it

    simple1.txt--
    hello hi
    how are you



[]$ tr ' ' '\n' < simple.txt | grep  -i -c '\bh\w*'
4
[]$ tr ' ' '\n' < simple1.txt | grep  -i -c '\bh\w*'
3

Estos comandos muestran el número de palabras que comienzan con "h" para cada archivo, pero quiero mostrar que el recuento total es 7, es decir, el total de ambos archivos. ¿Puedo hacer esto en un solo comando / script de shell?

P.S .: Tuve que escribir dos comandos ya que tr no toma dos nombres de archivo.

3
Parth Parikh 7 mar. 2018 a las 04:16

3 respuestas

La mejor respuesta

Esta alternativa no requiere tuberías:

$ awk -v RS='[[:space:]]+' '/^h/{i++} END{print i+0}' simple.txt simple1.txt
7

Cómo funciona

  • -v RS='[[:space:]]+'

    Esto le dice a awk que trate cada palabra como un registro.

  • /^h/{i++}

    Para cualquier registro (palabra) que comience con h, incrementamos la variable i en 1.

  • END{print i+0}

    Una vez que hayamos terminado de leer todos los archivos, imprimiremos el valor de i.

2
John1024 7 mar. 2018 a las 01:28

No es el caso, que tr acepta solo un nombre de archivo, no acepta ningún nombre de archivo (y siempre lee de stdin). Es por eso que incluso en su solución, no proporcionó un nombre de archivo para tr, sino que utilizó la redirección de entrada.

En su caso, creo que puede reemplazar tr por fmt, que acepta nombres de archivo:

fmt -1 simple.txt simple1.txt | grep -i -c -w 'h.*'

(También cambié un poco el grep , porque personalmente me parece mejor legible de esta manera, pero esto es cuestión de gustos).

Tenga en cuenta que ambas soluciones (la mía y las originales) contarían una cadena que consta de letras y uno o más caracteres no espaciales, por ejemplo, la cadena haaaa.hbbbbbb.hccccc , como un "bloque único" , es decir, solo agregaría 1 al recuento de palabras "h", no 3. Si este es o no el comportamiento deseado, depende de usted decidir.

0
user1934428 7 mar. 2018 a las 08:40

Intente esto de la manera directa:

cat simple.txt simple1.txt | tr ' ' '\n' | grep  -i -c '\bh\w*'
4
Gilles Quenot 7 mar. 2018 a las 01:57