Di mîlyonçirkeyan de tarîxa herî nêz a demî li hev bikin

Я отвечу на свой вопрос, немного покопавшись. Короче говоря, это зависит от архитектуры. PowerPC32 определяет предпочтительную функцию адреса загрузки, в то время как большинство других арок, включая x86, не определяют ее.

/* The idea here is that to conform to the ABI, we are supposed to try
   to load dynamic objects between 0x10000 (we actually use 0x40000 as
   the lower bound, to increase the chance of a memory reference from
   a null pointer giving a segfault) and the program's load address;
   this may allow us to use a branch instruction in the PLT rather
   than a computed jump.  The address is only used as a preference for
   mmap, so if we get it wrong the worst that happens is that it gets
   mapped somewhere else.  */

ElfW(Addr)
__elf_preferred_address (struct link_map *loader, size_t maplength,
             ElfW(Addr) mapstartpref)
{
  ElfW(Addr) low, high;
  struct link_map *l;
  Lmid_t nsid;

  /* If the object has a preference, load it there!  */
  if (mapstartpref != 0)
    return mapstartpref;

  /* Otherwise, quickly look for a suitable gap between 0x3FFFF and
     0x70000000.  0x3FFFF is so that references off NULL pointers will
     cause a segfault, 0x70000000 is just paranoia (it should always
     be superseded by the program's load address).  */
  low =  0x0003FFFF;
  high = 0x70000000;
  for (nsid = 0; nsid < DL_NNS; ++nsid)
    for (l = GL(dl_ns)[nsid]._ns_loaded; l; l = l->l_next)
      {
    ElfW(Addr) mapstart, mapend;
    mapstart = l->l_map_start & ~(GLRO(dl_pagesize) - 1);
    mapend = l->l_map_end | (GLRO(dl_pagesize) - 1);
    assert (mapend > mapstart);

    /* Prefer gaps below the main executable, note that l ==
       _dl_loaded does not work for static binaries loading
       e.g. libnss_*.so.  */
    if ((mapend >= high || l->l_type == lt_executable)
        && high >= mapstart)
      high = mapstart;
    else if (mapend >= low && low >= mapstart)
      low = mapend;
    else if (high >= mapend && mapstart >= low)
      {
        if (high - mapend >= mapstart - low)
          low = mapend;
        else
          high = mapstart;
      }
      }

  high -= 0x10000; /* Allow some room between objects.  */
  maplength = (maplength | (GLRO(dl_pagesize) - 1)) + 1;
  if (high <= low || high - low < maplength )
    return 0;
  return high - maplength;  /* Both high and maplength are page-aligned.  */
}
0
07.03.2018, 02:41
2 ответа

Aquí hay una opción usando awk y fecha GNU; utiliza datepara hacer el "trabajo pesado" de calcular las marcas de tiempo en fracciones de segundo a partir de los campos de fecha y hora; awk luego almacena cada registro en una matriz indexada por esa marca de tiempo. Un efecto secundario de esto es que los registros duplicados se "borran" --y solo se devuelve el resultado para la entrada 16:45:29.557. Después de calcular todas las marcas de tiempo -en -segundos, recorremos los registros en busca de la coincidencia más cercana a "+5 minutos" de cada entrada. Si la diferencia de marca de tiempo de la entrada más cercana es inferior a 2 minutos (del objetivo de 5 minutos ), imprimimos la fecha y la hora correspondientes y la lectura de faradios (simplemente reemplazando la cadena "faradios" con la cadena vacía ); de lo contrario, imprimimos los campos "NA", como según su comentario . Esa es una desviación de su especificación, suponiendo que una entrada coincidente para un registro determinado podría ser "mañana".

{
  day=$1
  split($2, t, ".")
  x=day " " t[1]
  ("date --date=\""x"\" +%s") | getline seconds
  t[3]=seconds"."t[2]
  records[t[3]]=$0
}
END {
  for (record in records) {
    min=(0 + "INF")
    for (others in records) {
      # skip myself
      if (others == record) continue
      difference=(others - record) - (5 * 60)
      if (difference < 0) difference=-difference
      if (difference < min) {
         min=difference
         matchfor[record]=records[others]
      }
    }
    if (min > (60*2)) {
      print records[record], "NA NA"
    } else {
      sub("farads", "", matchfor[record])
      print records[record], matchfor[record]
    }
  }
}

Salida de la entrada de muestra (sin ordenar):

 2018-02-16      16:51:22.525    farads  0.0005900000 NA NA
 2018-02-16      16:45:29.558    farads  0.0004300000  2018-02-16      16:50:40.486      0.0002400000
 2018-02-16      16:45:29.557    farads  0.0004300000  2018-02-16      16:50:40.486      0.0002400000
 2018-02-16      16:46:09.300    farads  0.0004300000  2018-02-16      16:51:22.525      0.0005900000
 2018-02-16      16:50:40.486    farads  0.0002400000 NA NA
 2018-02-16      16:48:34.077    farads  0.0006600000  2018-02-16      16:52:01.997      0.0003900000
 2018-02-16      16:47:51.612    farads  0.0006500000  2018-02-16      16:52:01.997      0.0003900000
 2018-02-16      16:47:51.611    farads  0.0006500000  2018-02-16      16:52:01.997      0.0003900000
 2018-02-16      16:49:59.075    farads  0.0000700000 NA NA
 2018-02-16      16:49:17.015    farads  0.0003300000 NA NA
 2018-02-16      16:52:01.997    farads  0.0003900000 NA NA
 2018-02-16      16:47:10.987    farads  0.0002800000  2018-02-16      16:52:01.997      0.0003900000

... y canalizado a|sort:

 2018-02-16      16:45:29.557    farads  0.0004300000  2018-02-16      16:50:40.486      0.0002400000
 2018-02-16      16:45:29.558    farads  0.0004300000  2018-02-16      16:50:40.486      0.0002400000
 2018-02-16      16:46:09.300    farads  0.0004300000  2018-02-16      16:51:22.525      0.0005900000
 2018-02-16      16:47:10.987    farads  0.0002800000  2018-02-16      16:52:01.997      0.0003900000
 2018-02-16      16:47:51.611    farads  0.0006500000  2018-02-16      16:52:01.997      0.0003900000
 2018-02-16      16:47:51.612    farads  0.0006500000  2018-02-16      16:52:01.997      0.0003900000
 2018-02-16      16:48:34.077    farads  0.0006600000  2018-02-16      16:52:01.997      0.0003900000
 2018-02-16      16:49:17.015    farads  0.0003300000 NA NA
 2018-02-16      16:49:59.075    farads  0.0000700000 NA NA
 2018-02-16      16:50:40.486    farads  0.0002400000 NA NA
 2018-02-16      16:51:22.525    farads  0.0005900000 NA NA
 2018-02-16      16:52:01.997    farads  0.0003900000 NA NA

La salida del script, ejecutado en la entrada expandida, es:

2018-02-16 16:46:09.300 farads 0.0004300000 2018-02-16 16:51:22.525  0.0005900000
2018-02-16 16:47:10.987 farads 0.0002800000 2018-02-16 16:52:01.997  0.0003900000
2018-02-16 16:47:51.611 farads 0.0006500000 2018-02-16 16:52:43.612  0.0005200000
2018-02-16 16:47:51.612 farads 0.0006500000 2018-02-16 16:52:43.612  0.0005200000
2018-02-16 16:48:34.077 farads 0.0006600000 2018-02-16 16:53:23.550  0.0003900000
2018-02-16 16:49:17.015 farads 0.0003300000 2018-02-16 16:54:03.276  0.0005300000
2018-02-16 16:49:59.075 farads 0.0000700000 2018-02-16 16:54:44.223  0.0003800000
2018-02-16 16:50:40.486 farads 0.0002400000 2018-02-16 16:55:24.769  0.0003200000
2018-02-16 16:51:22.525 farads 0.0005900000 2018-02-16 16:56:10.028  0.0002700000
2018-02-16 16:52:01.997 farads 0.0003900000 2018-02-16 16:56:57.624  0.0000900000
2018-02-16 16:52:43.612 farads 0.0005200000 2018-02-16 16:57:37.387  0.0003000000
2018-02-16 16:53:23.550 farads 0.0003900000 2018-02-16 16:58:16.929  0.0005800000
2018-02-16 16:54:03.276 farads 0.0005300000 2018-02-16 16:58:56.961  0.0003000000
2018-02-16 16:54:44.223 farads 0.0003800000 2018-02-16 16:59:39.217  0.0001900000
2018-02-16 16:55:24.769 farads 0.0003200000 2018-02-16 17:00:19.129  0.0005800000
2018-02-16 16:56:10.028 farads 0.0002700000 2018-02-16 17:00:59.328  0.0001500000
2018-02-16 16:56:57.624 farads 0.0000900000 2018-02-16 17:01:39.138  0.0005400000
2018-02-16 16:57:37.387 farads 0.0003000000 2018-02-16 17:02:19.786  0.0006600000
2018-02-16 16:58:16.929 farads 0.0005800000 2018-02-16 17:03:00.236  0.0004700000
2018-02-16 16:58:56.961 farads 0.0003000000 2018-02-16 17:03:44.343  0.0003300000
2018-02-16 16:59:39.217 farads 0.0001900000 2018-02-16 17:04:24.996  0.0002200000
2018-02-16 17:00:19.129 farads 0.0005800000 2018-02-16 17:05:05.754  0.0003200000
2018-02-16 17:00:59.328 farads 0.0001500000 2018-02-16 17:05:48.512  0.0004600000
2018-02-16 17:01:39.138 farads 0.0005400000 2018-02-16 17:06:29.248  0.0003700000
2018-02-16 17:02:19.786 farads 0.0006600000 2018-02-16 17:07:09.819  0.0001300000
2018-02-16 17:03:00.236 farads 0.0004700000 2018-02-16 17:07:50.392  0.0005500000
2018-02-16 17:03:44.343 farads 0.0003300000 2018-02-16 17:08:32.397  0.0002000000
2018-02-16 17:04:24.996 farads 0.0002200000 2018-02-16 17:09:14.778  0.0003000000
2018-02-16 17:05:05.754 farads 0.0003200000 2018-02-16 17:09:57.688  0.0003100000
2018-02-16 17:05:48.512 farads 0.0004600000 2018-02-16 17:10:37.237  0.0003900000
2018-02-16 17:06:29.248 farads 0.0003700000 2018-02-16 17:11:21.559  0.0003500000
2018-02-16 17:07:09.819 farads 0.0001300000 2018-02-16 17:12:00.946  0.0003500000
2018-02-16 17:07:50.392 farads 0.0005500000 2018-02-16 17:12:44.127  0.0003200000
2018-02-16 17:08:32.397 farads 0.0002000000 2018-02-16 17:13:26.579  0.0003800000
2018-02-16 17:09:14.778 farads 0.0003000000 2018-02-16 17:14:09.175  0.0001100000
2018-02-16 17:09:57.688 farads 0.0003100000 2018-02-16 17:14:49.553  0.0001300000
2018-02-16 17:10:37.237 farads 0.0003900000 2018-02-16 17:15:31.044  0.0002000000
2018-02-16 17:11:21.559 farads 0.0003500000 2018-02-16 17:16:12.039  0.0000400000
2018-02-16 17:12:00.945 farads 0.0003500000 2018-02-16 17:16:52.956  0.0002300000
2018-02-16 17:12:00.946 farads 0.0003500000 2018-02-16 17:16:52.956  0.0002300000
2018-02-16 17:12:44.127 farads 0.0003200000 2018-02-16 17:17:33.238  0.0001900000
2018-02-16 17:13:26.579 farads 0.0003800000 2018-02-16 17:18:12.987  0.0001900000
2018-02-16 17:14:09.175 farads 0.0001100000 2018-02-16 17:18:54.214  0.0002300000
2018-02-16 17:14:49.552 farads 0.0001300000 2018-02-16 17:19:34.432  0.0001500000
2018-02-16 17:14:49.553 farads 0.0001300000 2018-02-16 17:19:34.432  0.0001500000
2018-02-16 17:15:31.044 farads 0.0002000000 2018-02-16 17:20:22.002  0.0000700000
2018-02-16 17:16:12.038 farads 0.0000400000 2018-02-16 17:21:03.320  0.0001100000
2018-02-16 17:16:12.039 farads 0.0000400000 2018-02-16 17:21:03.320  0.0001100000
2018-02-16 17:16:52.956 farads 0.0002300000 2018-02-16 17:21:43.477  0.0002000000
2018-02-16 17:17:33.238 farads 0.0001900000 2018-02-16 17:22:27.400  0.0003500000
2018-02-16 17:18:12.986 farads 0.0001900000 2018-02-16 17:23:11.224  0.0001700000
2018-02-16 17:18:12.987 farads 0.0001900000 2018-02-16 17:23:11.224  0.0001700000
2018-02-16 17:18:54.214 farads 0.0002300000 2018-02-16 17:23:52.907  0.0001100000
2018-02-16 17:19:34.432 farads 0.0001500000 2018-02-16 17:24:40.392  0.0001500000
2018-02-16 17:20:22.002 farads 0.0000700000 2018-02-16 17:25:23.026  0.0001400000
2018-02-16 17:21:03.320 farads 0.0001100000 2018-02-16 17:26:03.886  0.0003100000
2018-02-16 17:21:43.477 farads 0.0002000000 2018-02-16 17:26:45.191  0.0001900000
2018-02-16 17:22:27.400 farads 0.0003500000 2018-02-16 17:27:28.652  0.0001000000
2018-02-16 17:23:11.224 farads 0.0001700000 2018-02-16 17:28:09.625  0.0002000000
2018-02-16 17:23:52.907 farads 0.0001100000 2018-02-16 17:28:49.753  0.0001500000
2018-02-16 17:24:40.392 farads 0.0001500000 2018-02-16 17:29:29.224  0.0005600000
2018-02-16 17:25:23.026 farads 0.0001400000 2018-02-16 17:30:10.520  0.0002100000
2018-02-16 17:26:03.886 farads 0.0003100000 2018-02-16 17:30:50.702  0.0001700000
2018-02-16 17:26:45.191 farads 0.0001900000 2018-02-16 17:31:30.077  0.0004800000
2018-02-16 17:26:45.192 farads 0.0001900000 2018-02-16 17:31:30.077  0.0004800000
2018-02-16 17:27:28.652 farads 0.0001000000 2018-02-16 17:32:11.586  0.0003800000
2018-02-16 17:28:09.625 farads 0.0002000000 2018-02-16 17:32:51.434  0.0003600000
2018-02-16 17:28:49.753 farads 0.0001500000 2018-02-16 17:33:31.457  0.0005300000
2018-02-16 17:29:29.224 farads 0.0005600000 2018-02-16 17:34:10.910  0.0007600000
2018-02-16 17:30:10.520 farads 0.0002100000 2018-02-16 17:34:51.175  0.0004400000
2018-02-16 17:30:50.702 farads 0.0001700000 2018-02-16 17:35:31.234  0.0004800000
2018-02-16 17:31:30.077 farads 0.0004800000 2018-02-16 17:36:22.164  0.0002600000
2018-02-16 17:32:11.586 farads 0.0003800000 2018-02-16 17:37:02.616  0.0004100000
2018-02-16 17:32:51.434 farads 0.0003600000 2018-02-16 17:37:42.127  0.0003500000
2018-02-16 17:33:31.457 farads 0.0005300000 2018-02-16 17:38:23.346  0.0004100000
2018-02-16 17:34:10.910 farads 0.0007600000 2018-02-16 17:39:04.611  0.0002400000
2018-02-16 17:34:51.174 farads 0.0004400000 2018-02-16 17:39:46.119  0.0000700000
2018-02-16 17:34:51.175 farads 0.0004400000 2018-02-16 17:39:46.119  0.0000700000
2018-02-16 17:35:31.234 farads 0.0004800000 2018-02-16 17:40:33.633  0.0001500000
2018-02-16 17:36:22.164 farads 0.0002600000 2018-02-16 17:41:13.308  0.0001500000
2018-02-16 17:37:02.616 farads 0.0004100000 2018-02-16 17:41:54.643  0.0003100000
2018-02-16 17:37:42.127 farads 0.0003500000 2018-02-16 17:42:33.994  0.0002300000
2018-02-16 17:38:23.346 farads 0.0004100000 2018-02-16 17:43:14.389  0.0004000000
2018-02-16 17:39:04.611 farads 0.0002400000 2018-02-16 17:43:54.324  0.0002200000
2018-02-16 17:39:46.119 farads 0.0000700000 2018-02-16 17:44:36.122  0.0001800000
2018-02-16 17:40:33.633 farads 0.0001500000 2018-02-16 17:45:16.828  0.0002600000
2018-02-16 17:41:13.307 farads 0.0001500000 2018-02-16 17:45:59.158  0.0001500000
2018-02-16 17:41:13.308 farads 0.0001500000 2018-02-16 17:45:59.158  0.0001500000
2018-02-16 17:41:54.643 farads 0.0003100000 2018-02-16 17:46:45.126  0.0000700000
2018-02-16 17:42:33.994 farads 0.0002300000 2018-02-16 17:47:25.236  0.0004400000
2018-02-16 17:43:14.389 farads 0.0004000000 2018-02-16 17:48:12.096  0.0002200000
2018-02-16 17:43:54.324 farads 0.0002200000 2018-02-16 17:49:01.891  0.0001600000
2018-02-16 17:44:36.122 farads 0.0001800000 2018-02-16 17:49:50.422  0.0002100000
2018-02-16 17:45:16.828 farads 0.0002600000 2018-02-16 17:50:31.222  0.0001300000
2018-02-16 17:45:59.158 farads 0.0001500000 2018-02-16 17:51:12.651  0.0002600000
2018-02-16 17:46:45.126 farads 0.0000700000 2018-02-16 17:51:53.478  0.0001300000
2018-02-16 17:47:25.236 farads 0.0004400000 2018-02-16 17:52:34.145  0.0004600000
2018-02-16 17:48:12.096 farads 0.0002200000 2018-02-16 17:53:14.374  0.0003300000
2018-02-16 17:49:01.891 farads 0.0001600000 2018-02-16 17:53:14.374  0.0003300000
2018-02-16 17:49:50.422 farads 0.0002100000 2018-02-16 17:53:14.374  0.0003300000
2018-02-16 17:50:31.222 farads 0.0001300000 NA NA
2018-02-16 17:51:12.651 farads 0.0002600000 NA NA
2018-02-16 17:51:12.652 farads 0.0002600000 NA NA
2018-02-16 17:51:53.478 farads 0.0001300000 NA NA
2018-02-16 17:52:34.145 farads 0.0004600000 NA NA
2018-02-16 17:53:14.374 farads 0.0003300000 NA NA
2018-02-16 23:53:53.906 farads 0.0002600000 2018-02-16 23:58:47.105  0.0003600000
2018-02-16 23:54:34.453 farads 0.0001200000 2018-02-16 23:59:27.080  0.0002300000
2018-02-16 23:55:15.512 farads 0.0001600000 2018-02-17 00:00:07.009  0.0002900000
2018-02-16 23:55:58.161 farads 0.0001800000 2018-02-17 00:00:51.685  0.0004900000
2018-02-16 23:56:46.602 farads 0.0002600000 2018-02-17 00:01:30.835  0.0003000000
2018-02-16 23:57:26.829 farads 0.0003100000 2018-02-17 00:02:14.187  0.0004300000
2018-02-16 23:57:26.830 farads 0.0003100000 2018-02-17 00:02:14.187  0.0004300000
2018-02-16 23:58:06.991 farads 0.0004400000 2018-02-17 00:02:56.048  0.0004700000
2018-02-16 23:58:47.104 farads 0.0003600000 2018-02-17 00:03:39.758  0.0004200000
2018-02-16 23:58:47.105 farads 0.0003600000 2018-02-17 00:03:39.758  0.0004200000
2018-02-16 23:59:27.080 farads 0.0002300000 2018-02-17 00:04:19.990  0.0001600000
2018-02-17 00:00:07.008 farads 0.0002900000 2018-02-17 00:04:59.854  0.0001700000
2018-02-17 00:00:07.009 farads 0.0002900000 2018-02-17 00:04:59.854  0.0001700000
2018-02-17 00:00:51.685 farads 0.0004900000 2018-02-17 00:05:40.967  0.0001400000
2018-02-17 00:01:30.835 farads 0.0003000000 2018-02-17 00:06:24.584  0.0001000000
2018-02-17 00:02:14.187 farads 0.0004300000 2018-02-17 00:07:04.742  0.0002500000
2018-02-17 00:02:56.048 farads 0.0004700000 2018-02-17 00:07:48.107  0.0003600000
2018-02-17 00:03:39.758 farads 0.0004200000 2018-02-17 00:08:31.136  0.0000700000
2018-02-17 00:04:19.990 farads 0.0001600000 2018-02-17 00:09:12.429  0.0001500000
2018-02-17 00:04:59.854 farads 0.0001700000 2018-02-17 00:09:59.567  0.0002500000
2018-02-17 00:05:40.967 farads 0.0001400000 2018-02-17 00:10:41.062  0.0001900000
2018-02-17 00:06:24.584 farads 0.0001000000 2018-02-17 00:11:21.016  0.0001600000
2018-02-17 00:07:04.742 farads 0.0002500000 2018-02-17 00:12:00.863  0.0001600000
2018-02-17 00:07:48.107 farads 0.0003600000 2018-02-17 00:12:41.023  0.0002400000
2018-02-17 00:08:31.136 farads 0.0000700000 2018-02-17 00:13:22.429  0.0001500000
2018-02-17 00:09:12.429 farads 0.0001500000 2018-02-17 00:14:04.826  0.0004100000
2018-02-17 00:09:59.567 farads 0.0002500000 2018-02-17 00:14:51.079  0.0001600000
2018-02-17 00:10:41.062 farads 0.0001900000 2018-02-17 00:15:31.247  0.0003500000
2018-02-17 00:11:21.016 farads 0.0001600000 2018-02-17 00:16:17.396  0.0001900000
2018-02-17 00:12:00.863 farads 0.0001600000 2018-02-17 00:16:56.912  0.0002100000
2018-02-17 00:12:41.023 farads 0.0002400000 2018-02-17 00:17:37.895  0.0001800000
2018-02-17 00:13:22.429 farads 0.0001500000 2018-02-17 00:18:18.354  0.0003700000
2018-02-17 00:14:04.826 farads 0.0004100000 2018-02-17 00:18:58.071  0.0004700000
2018-02-17 00:14:51.079 farads 0.0001600000 2018-02-17 00:18:58.071  0.0004700000
2018-02-17 00:15:31.247 farads 0.0003500000 2018-02-17 00:18:58.071  0.0004700000
2018-02-17 00:16:17.396 farads 0.0001900000 NA NA
2018-02-17 00:16:56.912 farads 0.0002100000 NA NA
2018-02-17 00:17:37.895 farads 0.0001800000 NA NA
2018-02-17 00:18:18.354 farads 0.0003700000 NA NA
2018-02-17 00:18:58.071 farads 0.0004700000 NA NA
2018-02-17 18:19:38.135 farads 0.0002000000 2018-02-17 18:24:27.966  0.0001800000
2018-02-17 18:20:22.373 farads 0.0002600000 2018-02-17 18:25:11.832  0.0002800000
2018-02-17 18:21:02.161 farads 0.0003000000 2018-02-17 18:25:52.344  0.0003000000
2018-02-17 18:21:43.806 farads 0.0002700000 2018-02-17 18:26:33.672  0.0002600000
2018-02-17 18:22:25.394 farads 0.0002500000 2018-02-17 18:27:15.499  0.0004300000
2018-02-17 18:23:06.549 farads 0.0003100000 2018-02-17 18:27:55.288  0.0004800000
2018-02-17 18:23:46.638 farads 0.0002100000 2018-02-17 18:28:56.699  0.0004200000
2018-02-17 18:24:27.966 farads 0.0001800000 2018-02-17 18:29:40.909  0.0002100000
2018-02-17 18:25:11.832 farads 0.0002800000 2018-02-17 18:30:20.942  0.0003400000
2018-02-17 18:25:52.344 farads 0.0003000000 2018-02-17 18:31:03.937  0.0003500000
2018-02-17 18:26:33.672 farads 0.0002600000 2018-02-17 18:31:51.329  0.0002500000
2018-02-17 18:27:15.499 farads 0.0004300000 2018-02-17 18:32:32.608  0.0005000000
2018-02-17 18:27:55.288 farads 0.0004800000 2018-02-17 18:33:12.869  0.0004900000
2018-02-17 18:28:56.699 farads 0.0004200000 2018-02-17 18:33:52.725  0.0002300000
2018-02-17 18:29:40.909 farads 0.0002100000 2018-02-17 18:34:39.022  0.0001300000
2018-02-17 18:30:20.942 farads 0.0003400000 2018-02-17 18:35:20.579  0.0002800000
2018-02-17 18:31:03.937 farads 0.0003500000 2018-02-17 18:36:00.487  0.0002400000
2018-02-17 18:31:51.329 farads 0.0002500000 2018-02-17 18:36:51.908  0.0004500000
2018-02-17 18:32:32.608 farads 0.0005000000 2018-02-17 18:37:33.667  0.0002500000
2018-02-17 18:33:12.869 farads 0.0004900000 2018-02-17 18:38:13.989  0.0004700000
2018-02-17 18:33:52.725 farads 0.0002300000 2018-02-17 18:38:53.753  0.0003500000
2018-02-17 18:34:39.022 farads 0.0001300000 2018-02-17 18:39:34.052  0.0004100000
2018-02-17 18:35:20.579 farads 0.0002800000 2018-02-17 18:39:34.052  0.0004100000
2018-02-17 18:36:00.487 farads 0.0002400000 2018-02-17 18:39:34.052  0.0004100000
2018-02-17 18:36:51.908 farads 0.0004500000 NA NA
2018-02-17 18:37:33.667 farads 0.0002500000 NA NA
2018-02-17 18:38:13.989 farads 0.0004700000 NA NA
2018-02-17 18:38:53.753 farads 0.0003500000 NA NA
2018-02-17 18:39:34.052 farads 0.0004100000 NA NA
0
28.01.2020, 02:32

Nota:Cuando publiqué esto originalmente, el código tenía un error que causaba que los tiempos que eran cinco minutos antes de la hora no coincidieran con sus correspondientes tiempos posteriores. Como no tuve tiempo de corregir el error en ese momento, eliminé la publicación, pero ahora ese error debería corregirse y he borrado la respuesta. Sin embargo, dado que solo proporcionó una línea de salida esperada, tenga cuidado de probar este código con un conjunto más amplio de entradas de muestra.

Dijiste que no estás tan preocupado por el tiempo de CPU, pero mi intento inicial que simplemente bruto -lo forzó al comparar cada línea con cada otra línea tomó 30 segundos para ejecutarse en un archivo de 1800 líneas, así que lo optimicé con el hash %mins, ingresado el tiempo al minuto, de modo que solo los minutos que son +4, +5 y +6 Se tienen en cuenta los minutos de cada marca de tiempo. Esta versión tarda ~4 segundos en ejecutarse en un archivo de entrada ~de 4000 líneas.

use warnings;
use strict;
use DateTime;
use DateTime::Format::Strptime;

my $strp = DateTime::Format::Strptime->new( on_error=>'croak',
    pattern => '%Y-%m-%d %H:%M:%S.%3N' );
my (@recs, %mins);
while (<>) {
    m{\A\s* ([-\d]+) \s+ ([\d:.]+) \s+farads\s+ ((?:\d+\.)?\d+) \s*\z}ixms
        or die "failed to parse line: $_";
    my $dt  = $strp->parse_datetime("$1 $2");
    my $min = int($dt->epoch/60);
    my $rec = { min=>$min, farads=>$3, dt=>$dt, seek=>$dt->clone->add(minutes=>5) };
    push @{ $mins{ $min } }, $rec;
    push @recs, $rec;
}

for my $cur (@recs) {
    my @candidates = (
        @{ $mins{$cur->{min}+4} // [] },
        @{ $mins{$cur->{min}+5} // [] },
        @{ $mins{$cur->{min}+6} // [] }  );
    my ($min_diff_ms,$min_other);
    for my $other (@candidates) {
        my $diff_ms = abs($cur->{seek}->subtract_datetime_absolute($other->{dt})
            ->in_units('nanoseconds'))/1e6;
        if (!defined $min_diff_ms || $diff_ms<$min_diff_ms) {
            $min_diff_ms = $diff_ms;
            $min_other = $other;
        }
    }
    print $cur->{dt}->strftime('%Y-%m-%d %H:%M:%S.%3N')," farads ",
        $cur->{farads}, defined($min_other) ? ( " ",
            $min_other->{dt}->strftime('%Y-%m-%d %H:%M:%S.%3N')," ",
            $min_other->{farads} ) : '', "\n";
}

Su entrada de muestra original:

 2018-02-16      16:45:29.557    farads  0.0004300000
 2018-02-16      16:45:29.557    farads  0.0004300000
 2018-02-16      16:45:29.558    farads  0.0004300000
 2018-02-16      16:46:09.300    farads  0.0004300000
 2018-02-16      16:47:10.987    farads  0.0002800000
 2018-02-16      16:47:51.611    farads  0.0006500000
 2018-02-16      16:47:51.612    farads  0.0006500000
 2018-02-16      16:48:34.077    farads  0.0006600000
 2018-02-16      16:49:17.015    farads  0.0003300000
 2018-02-16      16:49:59.075    farads  0.0000700000
 2018-02-16      16:50:40.486    farads  0.0002400000
 2018-02-16      16:51:22.525    farads  0.0005900000
 2018-02-16      16:52:01.997    farads  0.0003900000

Salida para esa entrada:

2018-02-16 16:45:29.557 farads 0.0004300000 2018-02-16 16:50:40.486 0.0002400000
2018-02-16 16:45:29.557 farads 0.0004300000 2018-02-16 16:50:40.486 0.0002400000
2018-02-16 16:45:29.558 farads 0.0004300000 2018-02-16 16:50:40.486 0.0002400000
2018-02-16 16:46:09.300 farads 0.0004300000 2018-02-16 16:51:22.525 0.0005900000
2018-02-16 16:47:10.987 farads 0.0002800000 2018-02-16 16:52:01.997 0.0003900000
2018-02-16 16:47:51.611 farads 0.0006500000 2018-02-16 16:52:01.997 0.0003900000
2018-02-16 16:47:51.612 farads 0.0006500000 2018-02-16 16:52:01.997 0.0003900000
2018-02-16 16:48:34.077 farads 0.0006600000 2018-02-16 16:52:01.997 0.0003900000
2018-02-16 16:49:17.015 farads 0.0003300000
2018-02-16 16:49:59.075 farads 0.0000700000
2018-02-16 16:50:40.486 farads 0.0002400000
2018-02-16 16:51:22.525 farads 0.0005900000
2018-02-16 16:52:01.997 farads 0.0003900000

Aquí hay una versión aún más rápida pero menos precisa, ignora los milisegundos y utiliza el módulo centralTime::Pieceen lugar del algo pesadoDateTime(aunque todavía puedo recomendar este último ). En comparación con lo anterior, tarda una fracción de segundo en ejecutarse. Puede ver la diferencia en la precisión, pero dijo que ± 1 minuto es aceptable.

use warnings;
use strict;
use Time::Piece;

my (@recs, %mins);
while (<>) {
    m{\A\s* ([-\d]+) \s+ ([\d:]+)(\.\d+) \s+farads\s+ ((?:\d+\.)?\d+) \s*\z}ixms
        or die "failed to parse line: $_";
    my $dt  = Time::Piece->strptime("$1 $2", '%Y-%m-%d %H:%M:%S');
    my $min = int($dt->epoch/60);
    my $rec = { min=>$min, farads=>$4, timestr=>"$1 $2$3", epoch=>$dt->epoch };
    push @{ $mins{ $min } }, $rec;
    push @recs, $rec;
}

for my $cur (@recs) {
    my @candidates = (
        @{ $mins{$cur->{min}+4} // [] },
        @{ $mins{$cur->{min}+5} // [] },
        @{ $mins{$cur->{min}+6} // [] }  );
    my ($min_diff_s,$min_other);
    for my $other (@candidates) {
        my $diff_s = abs( $other->{epoch} - $cur->{epoch} );
        if (!defined $min_diff_s || $diff_s<$min_diff_s) {
            $min_diff_s = $diff_s;
            $min_other = $other;
        }
    }
    print $cur->{timestr}," farads ",$cur->{farads},
        defined($min_other)
            ? ( " ", $min_other->{timestr}," ",$min_other->{farads} )
            : '', "\n";
}

Salida:

2018-02-16 16:45:29.557 farads 0.0004300000 2018-02-16 16:49:17.015 0.0003300000
2018-02-16 16:45:29.557 farads 0.0004300000 2018-02-16 16:49:17.015 0.0003300000
2018-02-16 16:45:29.558 farads 0.0004300000 2018-02-16 16:49:17.015 0.0003300000
2018-02-16 16:46:09.300 farads 0.0004300000 2018-02-16 16:50:40.486 0.0002400000
2018-02-16 16:47:10.987 farads 0.0002800000 2018-02-16 16:51:22.525 0.0005900000
2018-02-16 16:47:51.611 farads 0.0006500000 2018-02-16 16:51:22.525 0.0005900000
2018-02-16 16:47:51.612 farads 0.0006500000 2018-02-16 16:51:22.525 0.0005900000
2018-02-16 16:48:34.077 farads 0.0006600000 2018-02-16 16:52:01.997 0.0003900000
2018-02-16 16:49:17.015 farads 0.0003300000
2018-02-16 16:49:59.075 farads 0.0000700000
2018-02-16 16:50:40.486 farads 0.0002400000
2018-02-16 16:51:22.525 farads 0.0005900000
2018-02-16 16:52:01.997 farads 0.0003900000

(Tenga en cuenta que normalmente no habría proporcionado una solución completa a una pregunta sin código, pero esta fue una pregunta interesante para mí.)

2
28.01.2020, 02:32

Теги

Похожие вопросы