Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

226
Vistas
awk obtener los datos en función de la condición if else

Necesito nuevamente su experiencia, estoy tratando de hacer algo condicional usando awk para obtener las columnas.

Si miro los $5 , los datos pueden tener un year y, en algunos lugares, una date .

Entonces, cuando el year está allí, es bueno imprimir, pero otros valores en los que tengo date and time como 05:17:27 , entonces necesito imprimir el último campo.

 2021 2021 05:17:27 20:33:17 05:17:20 2020 2020 2021 2020 2021

A continuación se muestran mis datos de muestra.

archivo de datos.

 yogutdb01 Mon 28 Jun 2021 11:19:56 PM MST yogutdb02 Thu 30 Sep 2021 02:02:53 AM MST yogutdb03 Thu Jul 13 05:17:27 2017 yogutdb04 Fri Jun 23 20:33:17 2017 yogutdb05 Thu Jul 13 05:17:20 2017 yogutdb06 Wed 24 Jun 2020 03:49:16 PM MST yogutdb07 Wed 24 Jun 2020 04:05:10 PM MST yogutdb08 Sat 22 May 2021 04:19:14 AM MST yogutdb09 Thu 09 Apr 2020 12:16:32 PM CEST yogutdb10 Tue 11 May 2021 03:03:02 PM MST

Mi prueba: estoy usando a continuación pero obtengo un error de sintaxis en la condición else .

 $ awk '{ ($5=="[^0-9]+$")print $1,$2,$3,$4,$5; else print $1,$2,$3,$4,$NF}' my_data.text

Lo deseado debe ser:

 yogutdb01 2021 yogutdb02 2021 yogutdb03 2017 yogutdb04 2017 yogutdb05 2017 yogutdb06 2020 yogutdb07 2020 yogutdb08 2021 yogutdb09 2020 yogutdb10 2021

O

 yogutdb01 Mon 28 Jun 2021 yogutdb02 Thu 30 Sep 2021 yogutdb03 Thu Jul 13 2017 yogutdb04 Fri Jun 23 2017 yogutdb05 Thu Jul 13 2017 yogutdb06 Wed 24 Jun 2020 yogutdb07 Wed 24 Jun 2020 yogutdb08 Sat 22 May 2021 yogutdb09 Thu 09 Apr 2020 yogutdb10 Tue 11 May 2021
over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

  • No puede usar el operador == para probar la coincidencia de expresiones regulares. En su lugar, puede usar la función match() o el operador ~ .
  • Debe colocar la expresión regular ^ delante de [0-9] , no dentro.

Entonces, por favor, intente:

 awk '{if (match($5,/^[0-9]+$/)) print $1, $2, $3, $4, $5; else print $1, $2, $3, $4, $NF}' my_data.text

Producción:

 yogutdb01 Mon 28 Jun 2021 yogutdb02 Thu 30 Sep 2021 yogutdb03 Thu Jul 13 2017 yogutdb04 Fri Jun 23 2017 yogutdb05 Thu Jul 13 2017 yogutdb06 Wed 24 Jun 2020 yogutdb07 Wed 24 Jun 2020 yogutdb08 Sat 22 May 2021 yogutdb09 Thu 09 Apr 2020 yogutdb10 Tue 11 May 2021

Aquí hay una alternativa usando el operador ~ :

 awk '$5 ~ /^[0-9]+$/ {print $1, $2, $3, $4, $5; next} {print $1, $2, $3, $4, $NF}' my_data.text
over 4 years ago · Santiago Trujillo Denunciar

0

Según el resultado deseado, debe probar a continuación, que funcionará.

Puede usar coincidencias de expresiones regulares como ~ .

 $ awk '{ if ($5 !~ /:/) { print $1,$2,$3,$4,$5; next } { print $1,$2,$3,$4, $NF } }' exampl_data1

Resultado:

 yogutdb01 Mon 28 Jun 2021 yogutdb02 Thu 30 Sep 2021 yogutdb03 Thu Jul 13 2017 yogutdb04 Fri Jun 23 2017 yogutdb05 Thu Jul 13 2017 yogutdb06 Wed 24 Jun 2020 yogutdb07 Wed 24 Jun 2020 yogutdb08 Sat 22 May 2021 yogutdb09 Thu 09 Apr 2020 yogutdb10 Tue 11 May 2021

Solo para mencionar, como @tshiono también preguntó en el comentario, para obtener el resultado en orden, puede usar a continuación.

 $ awk '{ if ($5 !~ /:/) { print $1, $2, $3, $4, $5; next } { print $1, $2, $4, $3, $NF } }' exampl_data1
over 4 years ago · Santiago Trujillo Denunciar

0

Puede imprimir los primeros 4 campos y verificar el quinto campo para solo 4 dígitos. Si no hay solo 4 dígitos, imprima el último campo.

 awk '{print $1, $2, $3, $4, ($5 ~ /^[0-9]+$/ ? $5 : $NF)}' my_data.text

Producción

 yogutdb01 Mon 28 Jun 2021 yogutdb02 Thu 30 Sep 2021 yogutdb03 Thu Jul 13 2017 yogutdb04 Fri Jun 23 2017 yogutdb05 Thu Jul 13 2017 yogutdb06 Wed 24 Jun 2020 yogutdb07 Wed 24 Jun 2020 yogutdb08 Sat 22 May 2021 yogutdb09 Thu 09 Apr 2020 yogutdb10 Tue 11 May 2021
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda