awk sed si declaración

awk sed si declaración

Estoy intentando agregar 0 al principio, SI hay un "." en el segundo carácter de esa línea. No podía combinar estos dos;

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

mostrando el segundo personaje

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

añadiendo un cero al principio.

Debería haber un "si el segundo carácter es un punto".

archivo 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

Respuesta1

Podemos utilizar cualquiera de sedo awkpara resolver completamente el problema.


Con sed:

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

Cuando &ocurre en la parte de reemplazo del comando de sustitución ( s), se expandirá a la parte de la línea de entrada que coincide con la parte del patrón del comando.

La expresión regular ^.\.significa "coincide con todas las líneas que comienzan 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á reemplazado 01.al comienzo de la línea.


Con awk:

Sobre la base del awkcódigo parcial en la pregunta...

Esto, como se indicó, imprimirá el segundo carácter de cada línea de entrada:

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

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

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

Lo que entra { ... }es el código que antepone $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

Luego solo necesitamos asegurarnos de que todas las líneas estén impresas:

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

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

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

Algunas personas que piensan que "cuanto más corto siempre es mejor", lo escribirían 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:)

Respuesta2

Con asiento:

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

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

El sed expressoin s/.\{0\}/0/es algo extraño, coincide con cero o más copias de cualquier cosa y lo reemplaza con un cero. Por supuesto, el patrón coincidirá en todas las posiciones de la cuerda, pero como s///solo reemplaza la primera coincidencia, funciona según lo previsto. Sin embargo, es una forma pintoresca de hacerlo.


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 y luego agregamos un cero al frente de la línea si es así. El último invoca la acción predeterminada de imprimir la línea después de cualquier modificación.

Respuesta3

Dijiste awk y sed, pero parece que estás intentando formatear una fecha y para eso usaría el datecomando. 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 sedcomando en el medio cambia los puntos a barras para ingresar date -d. Las opciones de formato permiten la salida en casi cualquier formato que desee. En %mparticular, pondrá a cero el mes, que es lo que parece que estás intentando hacer.

Como señala Kusalananda:

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

Respuesta4

Con sed podría ser

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

Esto se utilizará ^para anclar al principio de la línea, luego capturará cualquier carácter individual de un grupo, seguido de un literal .y luego cualquier otra cosa. Si coincidimos, imprimimos a 0, luego nuestro primer grupo de captura (el carácter al comienzo de la línea), luego a y .luego nuestro segundo grupo de captura (el resto de la línea).

información relacionada