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!
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 deawk
, 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 porawk
.Para verificar la longitud de la cadena de entrada dentro de
awk
, se puede utilizar la funciónlength()
. La línea de comandos correcta para agregar un cero inicial a los números menores de 10 sería: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:
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.