es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Instrucción if-awk para contar el número de caracteres (wc -m) que vienen de una tubería.

Traté de entender este problema y no pude entender lo que estaba mal en mi línea de código de abajo.

Dado que:

echo "5" | wc -m
2

y que

echo "55" | wc -m
3

Traté de agregar un cero delante de todos los números que estuvieran por debajo de 9 con una declaración if en awk de la siguiente manera:


echo "5" | awk '{ if ( wc -m $0 -eq 2 ) print 0$1 ; else print $1 }'
05

lo que es “correcto”, sin embargo, con números de dos dígitos obtengo el mismo cero delante.


echo "55" | awk '{ if ( wc -m $0 -eq 2 ) print 0$1 ; else print $1 }'
055

¿Cómo es posible? Supuse que esto iba a devolver solamente “55” en lugar de “055”. Ahora entiendo que estoy construyendo mal la declaración if.

¿Cuál es entonces la manera correcta (si es que existe una) de pedirle a awk que evalúe si lo que viene del “|” tiene “2” caracteres como se haría con wc -m?

No estoy interesado en la manera óptima de agregar ceros a la izquierda en la línea de comandos (hay suficientes duplicados de eso).

¡Gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con la instrucción “if” en la línea de comandos dada es que intenta verificar la longitud de la cadena de entrada utilizando wc -m dentro de awk, lo cual no es un enfoque correcto. wc -m cuenta el número de caracteres en una cadena, incluido el carácter de nueva línea, que no es tomado en cuenta por awk.

    Para verificar la longitud de la cadena de entrada dentro de awk, se puede utilizar la función length(). La línea de comandos correcta para agregar un cero inicial a los números menores de 10 sería:

    echo "5" | awk '{ if ( length($0) == 1 ) print "0"$1 ; else print $1 }'
    

    Esto verifica si la longitud de la cadena de entrada es igual a 1 utilizando length(), y si es así, agrega un cero inicial antes de imprimir el resultado. Para cadenas de entrada con longitud mayor a 1, simplemente imprime la cadena de entrada tal cual.

    De manera similar, para agregar un cero inicial a los números menores de 100, se puede usar:

    echo "55" | awk '{ if ( length($0) == 1 ) print "00"$1 ; else if ( length($0) == 2 ) print "0"$1 ; else print $1 }'
    

    Esto verifica si la longitud de la cadena de entrada es igual a 1, en cuyo caso agrega dos ceros antes de imprimir el resultado, o si es igual a 2, en cuyo caso agrega un cero antes de imprimir el resultado. Para cadenas de entrada con una longitud mayor a 2, simplemente imprime la cadena de entrada tal cual.

Comments are closed.