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 2021A continuación se muestran mis datos de muestra.
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 MSTelse . $ awk '{ ($5=="[^0-9]+$")print $1,$2,$3,$4,$5; else print $1,$2,$3,$4,$NF}' my_data.text yogutdb01 2021 yogutdb02 2021 yogutdb03 2017 yogutdb04 2017 yogutdb05 2017 yogutdb06 2020 yogutdb07 2020 yogutdb08 2021 yogutdb09 2020 yogutdb10 2021O
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== para probar la coincidencia de expresiones regulares. En su lugar, puede usar la función match() o el operador ~ .^ 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.textProducció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.textSegú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 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 2021Solo 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_data1Puede 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.textProducció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