Cómo convertir el número de la semana y el día de la semana en la fecha -- bash campo con date campo con awk camp Relacionados El problema

How to convert week number and week day into date


-1
vote

problema

Español

Tengo archivos CVS que contienen información de la fecha en tres columos separados que me gustaría combinar. La información que tengo es:

  • Dos dígitos año (campo 2)
  • Número de semana (campo 3)
  • Número de día de la semana (campo 4)

¿Cómo puedo convertir estos 3 números en el formato de fecha normal del formulario YYYYMMDD ?

Mi archivo de entrada parece:

  740054,17,40,1,0000000000001,25,25,test1,1 740054,17,40,2,0000000000001,24,24,test2,1 740054,17,40,4,0000000000001,19,19,test3,1   

y la salida esperada que me gustaría tener es:

  740054,20171002,0000000000001,25,25,test1,1 740054,20171003,0000000000001,24,24,test2,1 740054,20171005,0000000000001,19,19,test3,1   

Como ejemplo para la primera línea: el 2 de octubre de 2017 es el lunes (1) de la 40ª semana del año 2017

¿Alguien sabe cómo hacer una conversión de este tipo?

Original en ingles

I have CVS files which contain date information in three separate colums which I would like to combine. The information I have is:

  • Two digit year (field 2)
  • Week number (field 3)
  • Day of week number (field 4)

How can I convert these 3 numbers into normal date format of the form YYYYMMDD?

My input file looks like:

740054,17,40,1,0000000000001,25,25,test1,1 740054,17,40,2,0000000000001,24,24,test2,1 740054,17,40,4,0000000000001,19,19,test3,1 

And the expected output I would like to have is:

740054,20171002,0000000000001,25,25,test1,1 740054,20171003,0000000000001,24,24,test2,1 740054,20171005,0000000000001,19,19,test3,1 

As an example for the first line: October 2, 2017 is the Monday (1) of the 40th week of the year 2017

Does anybody know how to do such a conversion?

        
         
         

Lista de respuestas

0
 
vote
vote
La mejor respuesta
 

Asumiré que su número de semana está de acuerdo con la definición ISO 8601 (para otras definiciones, consulte aquí ). Esta ISO 8601 Standard se usa ampliamente en el mundo: la UE y la mayoría de los demás Países europeos, la mayor parte de Asia, y Oceanía

El estándar ISO 8601 establece lo siguiente:

  • Hay 7 días en una semana
  • El primer día de la semana es un lunes
  • La primera semana es la primera semana del año que contiene una jueves . Esto significa que es la primera semana con 4 días o más. en enero.

Con esta definición, es posible tener una semana número 53. Estos ocurren con el primero de enero está en un Viernes (por ejemplo, 2016-01-01, 2010-01-01). O, si el año anterior fue un Año bisiesto, también un sábado. (Por ejemplo, 2005-01-01)

     December 2015               January 2016          Mo Tu We Th Fr Sa Su CW    Mo Tu We Th Fr Sa Su CW      1  2  3  4  5  6 49                 1  2  3 53   7  8  9 10 11 12 13 50     4  5  6  7  8  9 10 01  14 15 16 17 18 19 20 51    11 12 13 14 15 16 17 02  21 22 23 24 25 26 27 52    18 19 20 21 22 23 24 03  28 29 30 31          53    25 26 27 28 29 30 31 04   

Dado el year , week_number y fopub0 , ¿cómo podemos reconstruir la fecha? La respuesta requiere varios pasos y calculará el día del año ( fopub11111 ) de la fecha solicitada.

Para calcular el día del año fopub2 Primero debemos averiguar cuándo se inicia la primera semana como se explica anteriormente. Si el 01 de enero es el martes, la primera semana solo contiene 6 días y no 7, mientras que si el 1 de enero es un viernes, la primera semana comienza solo a la semana después. Así que podemos resolver esto agregando un desplazamiento. La compensación se puede encontrar en la siguiente tabla:

  fopub3  

y este compensado se calcula como fopub4

Entonces, con esto, el día del año es muy fácil de calcular:

  fopub5  

TENGO ESTO, PODEMOS ESCRIBIR LA SIGUIENTE HERMENA DE GNU AWK:

  fopub6  
 

I will make the assumption that your week-number is according to the ISO 8601 definition (for other definitions see here). This ISO 8601 standard is widely used in the world: EU and most of other European countries, most of Asia, and Oceania

The ISO 8601 standard states the following:

  • There are 7 days in a week
  • The first day of the week is a Monday
  • The first week is the first week of the year which contains a Thursday. This means it is the first week with 4 days or more in January.

With this definition, it is possible to have a week number 53. These occur with the first of January is on a Friday (E.g. 2016-01-01, 2010-01-01). Or, if the year before was a leap year, also a Saturday. (E.g. 2005-01-01)

   December 2015               January 2016          Mo Tu We Th Fr Sa Su CW    Mo Tu We Th Fr Sa Su CW      1  2  3  4  5  6 49                 1  2  3 53   7  8  9 10 11 12 13 50     4  5  6  7  8  9 10 01  14 15 16 17 18 19 20 51    11 12 13 14 15 16 17 02  21 22 23 24 25 26 27 52    18 19 20 21 22 23 24 03  28 29 30 31          53    25 26 27 28 29 30 31 04 

Given the year, week_number and day_of_week, how can we reconstruct the date? The answer requires several steps and will compute the day of the year (doy) of the requested date.

To compute the day of the year doy we first need to figure out when the first-week starts as explained above. If Jan 01 is a Tuesday, then the first week only contains 6 days and not 7, while if Jan 01 is a Friday, the first week starts only the week after. So we can solve this by adding an offset. The offset can be found in the following table:

dow001 str: Mo Tu We Th Fr Sa Su dow001 num: 01 02 03 04 05 06 07 offset    :  0 -1 -2 -3  3  2  1 

and this offset is computed as 3-(dow001+2)%7

So with this, the day of the year is very easily computed:

doy = (week_number-1) * 7 + 3-(dow001+2)%7 + day_of_week 

So having this, we can write the following GNU awk tool:

awk 'function compute_date(YYYY,CW,DOW) {         dow001 = strftime("%u",mktime(YYYY " 01 01 00 00 00"))         doy    =  (CW-1)*7 + (3 - (dow001+2)%7) + DOW         return strftime("%Y%m%d",mktime(YYYY " 01 " doy " 00 00 00"))}      }      BEGIN { FS = OFS = "," }      { datestr = compute_date(2000+$2,$3,$4) }      { print $1, datestr , $5,$6,$7,$8,$9 }' file   740054,20171002,0000000000001,25,25,test1,1 740054,20171003,0000000000001,24,24,test2,1 740054,20171005,0000000000001,19,19,test3,1 
 
 
 
 

Relacionados problema

1  Edición de archivos de texto con Perl  ( Editing text files with perl ) 
Estoy tratando de editar un archivo de texto que se ve así: TYPE=Ethernet HWADDR=00:.... IPV6INIT=no MTU=1500 IPADDR=192.168.2.247 ... (es en realidad ...

0  Quiero analizar el texto de una fuente de XML comprimida usando AWK  ( I want to parse text from a compressed xml feed using awk ) 
Estoy tratando de analizar <title> y <description> En la fuente de XML comprimida en http://rss.slashdot.org/lashdot/slashdot . Estoy tratando de hacer l...

1  usando AWK para reemplazar una cadena por otra cadena (tabla de asignación contenida en un archivo)  ( Using awk to replace a string by another string mapping table contained in a fi ) 
Me gustaría saber si es posible hacer lo siguiente que solo usar AWK: Estoy buscando un poco de Regex en un archivo Fand quiero reemplazar la cadena (S1) que ...

2  Convertir notación científica al decimal en campos múltiples  ( Convert scientific notation to decimal in multiple fields ) 
Los siguientes trabajos son excelentes en mis datos en la columna 12, pero tengo más de 70 columnas que no son todas iguales y necesito generar todas las colu...

2  Buscar / leer otro archivo de AWK basado en los contenidos de los archivos actuales, ¿es posible?  ( Searching reading another file from awk based on current files contents is it ) 
Estoy procesando un archivo enorme con (GNU) awk , (Otras herramientas disponibles son: Linux Shell Tools, algunas versiones antiguas (y GT; 5.0) de Perl, pe...

0  Usando AWK para sumar la columna de diferentes archivos  ( Using awk to sum column from different files ) 
Tengo un montón de datos que se nombran como decidamos A0001.XYZ a A0254.XYZ. Quiero sumar la 5ª columna de cada archivo y escribir la respuesta a un archivo ...

1  Cálculo de distancias euclidianas con AWK que no dan la producción esperada  ( Calculation of euclidean distances with awk not giving the expected output ) 
Como entrada para la calulación de distancia, tengo un archivo (inp.txt) que contiene las coordenadas: 9.911 -2.781 30.097 7.768 -4.335 29.094 11.811 -1.90...

4  tubo una línea larga como múltiples líneas  ( Pipe one long line as multiple lines ) 
Digamos que tengo un montón de archivos XML que no contienen nuevas líneas, pero básicamente contienen una larga lista de registros, delimitados por </record...

1  Awk Pattern Matching  ( Awk pattern matching ) 
quiero imprimir userId = 1234 userid = 12345 timestamp = 88888888 js = abc de mis datos messssssssssssssssssssssssssssssssssssssssssssssssssssssssss...

0  Búsqueda de archivos por medio de palabras clave con una salida formateada en Bash  ( Search of files by means of keywords with a formatted output in bash ) 
Búsqueda de archivos por medio de palabras clave con una salida formateada Me gustaría encontrar cualquier tipo de archivo por medio de palabras clave y una...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos