awk sed if statement

Estoy tratando de agregar 0 al comienzo, SI hay un "." en el segundo personaje de esa línea. No podría combinar estos dos;

awk '{ print substr( $0, 2, 1 ) }' file.txt 

mostrando el segundo personaje

 sed -ie "s/.\{0\}/0/" file.txt 

agregando un cero al comienzo.

Debería haber un "si el segundo personaje es un punto".

file de muestra:

 1.02.2017 23:40:00 10.02.2017 23:40:00 

final:

 01.02.2017 23:40:00 10.02.2017 23:40:00 

Podemos usar sed o awk para resolver completamente el problema.


Con sed :

 $ sed 's/^.\./0&/' file.txt 

Cuando & ocurre en la parte de reemploop de los commands de sustitución, se expandirá a la parte de la línea de input que coincida con la parte de patrón del command.

La expresión regular ^.\. significa " unir todas las líneas que comiencen con ( ^ ) un carácter arbitrario ( . ) seguido de un punto literal ( \. ) ".

Si la línea es 1.02.2017 23:40:00 , el patrón coincidirá, y 1. sería reemplazado por 01. al comienzo de la línea.


Con awk :

Sobre la base del código awk parcial en la pregunta …

Esto, como se dijo, imprime el segundo carácter de cada línea de input:

 $ awk '{ print substr($0, 2, 1) }' file.txt 

Podemos usar el hecho de que substr($0, 2, 1) devuelve el segundo carácter y lo usa como condición:

 $ awk 'substr($0, 2, 1) == "." { ... }' file.txt 

Lo que entra en { ... } es el código que precede $0 , que es el contenido de la línea actual, con un cero si la condición anterior es verdadera:

 $ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 }' file.txt 

Entonces solo tenemos que asegurarnos de que todas las líneas estén impresas:

 $ awk 'substr($0, 2, 1) == "." { $0 = "0" $0 } { print }' file.txt 

La condición substr($0, 2, 1) == "." por supuesto, también se puede cambiar a una expresión regular (utilizamos exactamente la misma expresión que usamos en la solución sed ):

 $ awk '/^.\./ { $0 = "0" $0 } { print }' file.txt 

Algunas personas que piensan que "más corto siempre es mejor" escribirían eso como

 $ awk '/^.\./ { $0 = "0" $0 } 1' file.txt 

(y probablemente también elimine la mayoría de los espacios: awk '/^.\./{$0="0"$0}1' file.txt )

Con sed:

 sed -e "/^.\./s/^/0/" file.txt 

El patrón /^.\./ busca cualquier carácter y un punto literal al comienzo de la línea ^ , y si eso coincide, sustituye ese inicio de línea por cero, agregando efectivamente el cero al inicio.

La expresión de sed s/.\{0\}/0/ es algo extraña, coincide con cero o más copys de cualquier cosa y reemplaza con un cero. El patrón, por supuesto, coincidirá en cada position de la cadena, pero como s/// solo reemplaza la primera coincidencia, funciona de la forma prevista. Una forma pintoresca de hacerlo, sin embargo.


O con awk, una expresión regular similar funcionaría para coincidir con la línea, pero podemos usar substr :

 awk 'substr($0, 2, 1) == "." {$0 = "0" $0} 1' file.txt 

Primero probamos si el segundo carácter es un punto, luego agregamos un cero al frente de la línea si es así. El último invoca la acción pnetworkingeterminada de imprimir la línea después de cualquier modificación.

Dijiste awk y sed, pero parece que estás tratando de formatear una date y para eso usaría el command de date . Por ejemplo:

 echo '1.2.2017 23:40:00' | sed 's/\./\//g' | xargs -0 date '+%m.%d.%Y %T' -d 

saldrá

 01.02.2017 23:40:00 

El command sed en el medio cambia los períodos a barras para input en la date -d . Las opciones de formatting permiten la salida en casi cualquier formatting que desee. El %m en particular, rellenará cero el mes, que es lo que parece que estás tratando de hacer.

Como señala Kusalananda:

Aún más compacto (date GNU y Bash): date -f <(tr '.' '/' <dates.in) '+%m.%d.%Y %T'

Una estrategia diferente a la presentada en las otras respuestas: puede usar "." como el separador de campo.

 awk -F. '$1 < 10 {printf "0"} {print}' /tmp/in.txt 

Podrías golf esto para:

 awk -F. '$1<10{printf "0"}1' /tmp/in.txt 

Para sed, hay un command más corto, presentado en otra (gran) respuesta.

Con sed podría ser

 sed 's/^\(.\)\.\(.*\)/0\1.\2/' 

Esto usará ^ para anclar al principio de la línea, luego capturar cualquier carácter individual en un grupo, seguido de un literal . , luego cualquier otra cosa. Si hacemos coincidir que imprimimos un 0 , entonces nuestro primer grupo de captura (el personaje al comienzo de la línea), entonces a . luego nuestro segundo grupo de captura (el rest de la línea)