以毫秒為單位匹配最近的時間戳
我有一個大的 data.txt 文件,如下所示;對於每個時間戳,我需要在 5 分鐘後找到最近的時間匹配以及第 4 列上的值。現在將兩者列印在兩個新列中。
例如,對於“2018-02-16 16:45:29.557 法拉 0.0004300000”,我需要找到 5 分鐘後(即大約)16:50:40.486 法拉 0.0002400000 的最佳可用時間。
請注意,這裡沒有精確的時間匹配,這就是為什麼只需要最近的匹配。此外,當日期從 2018-02-16 更改為 2018-02-17 時,程式碼應該可以無縫執行。
最終輸出應該是
"2018-02-16 16:45:29.557 farads 0.0004300000 16:50:40.486 0.0002400000"
我怎樣才能做到這一點?
col1 col2 col3 col4 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 2018-02-16 16:52:43.612 farads 0.0005200000 2018-02-16 16:53:23.550 farads 0.0003900000 2018-02-16 16:54:03.276 farads 0.0005300000 2018-02-16 16:54:44.223 farads 0.0003800000 2018-02-16 16:55:24.769 farads 0.0003200000 2018-02-16 16:56:10.028 farads 0.0002700000 2018-02-16 16:56:57.624 farads 0.0000900000 2018-02-16 16:57:37.387 farads 0.0003000000 2018-02-16 16:58:16.929 farads 0.0005800000 2018-02-16 16:58:56.961 farads 0.0003000000 2018-02-16 16:59:39.217 farads 0.0001900000 2018-02-16 17:00:19.129 farads 0.0005800000 2018-02-16 17:00:59.328 farads 0.0001500000 2018-02-16 17:01:39.138 farads 0.0005400000 2018-02-16 17:02:19.786 farads 0.0006600000 2018-02-16 17:03:00.236 farads 0.0004700000 2018-02-16 17:03:44.343 farads 0.0003300000 2018-02-16 17:04:24.996 farads 0.0002200000 2018-02-16 17:05:05.754 farads 0.0003200000 2018-02-16 17:05:48.512 farads 0.0004600000 2018-02-16 17:06:29.248 farads 0.0003700000 2018-02-16 17:07:09.819 farads 0.0001300000 2018-02-16 17:07:50.392 farads 0.0005500000 2018-02-16 17:08:32.397 farads 0.0002000000 2018-02-16 17:09:14.778 farads 0.0003000000 2018-02-16 17:09:57.688 farads 0.0003100000 2018-02-16 17:10:37.237 farads 0.0003900000 2018-02-16 17:11:21.559 farads 0.0003500000 2018-02-16 17:12:00.945 farads 0.0003500000 2018-02-16 17:12:00.946 farads 0.0003500000 2018-02-16 17:12:44.127 farads 0.0003200000 2018-02-16 17:13:26.579 farads 0.0003800000 2018-02-16 17:14:09.175 farads 0.0001100000 2018-02-16 17:14:49.552 farads 0.0001300000 2018-02-16 17:14:49.553 farads 0.0001300000 2018-02-16 17:15:31.044 farads 0.0002000000 2018-02-16 17:16:12.038 farads 0.0000400000 2018-02-16 17:16:12.039 farads 0.0000400000 2018-02-16 17:16:52.956 farads 0.0002300000 2018-02-16 17:17:33.238 farads 0.0001900000 2018-02-16 17:18:12.986 farads 0.0001900000 2018-02-16 17:18:12.987 farads 0.0001900000 2018-02-16 17:18:54.214 farads 0.0002300000 2018-02-16 17:19:34.432 farads 0.0001500000 2018-02-16 17:20:22.002 farads 0.0000700000 2018-02-16 17:21:03.320 farads 0.0001100000 2018-02-16 17:21:43.477 farads 0.0002000000 2018-02-16 17:22:27.400 farads 0.0003500000 2018-02-16 17:23:11.224 farads 0.0001700000 2018-02-16 17:23:52.907 farads 0.0001100000 2018-02-16 17:24:40.392 farads 0.0001500000 2018-02-16 17:25:23.026 farads 0.0001400000 2018-02-16 17:26:03.886 farads 0.0003100000 2018-02-16 17:26:45.191 farads 0.0001900000 2018-02-16 17:26:45.192 farads 0.0001900000 2018-02-16 17:27:28.652 farads 0.0001000000 2018-02-16 17:28:09.625 farads 0.0002000000 2018-02-16 17:28:49.753 farads 0.0001500000 2018-02-16 17:29:29.224 farads 0.0005600000 2018-02-16 17:30:10.520 farads 0.0002100000 2018-02-16 17:30:50.702 farads 0.0001700000 2018-02-16 17:31:30.077 farads 0.0004800000 2018-02-16 17:32:11.586 farads 0.0003800000 2018-02-16 17:32:51.434 farads 0.0003600000 2018-02-16 17:33:31.457 farads 0.0005300000 2018-02-16 17:34:10.910 farads 0.0007600000 2018-02-16 17:34:51.174 farads 0.0004400000 2018-02-16 17:34:51.175 farads 0.0004400000 2018-02-16 17:35:31.234 farads 0.0004800000 2018-02-16 17:36:22.164 farads 0.0002600000 2018-02-16 17:37:02.616 farads 0.0004100000 2018-02-16 17:37:42.127 farads 0.0003500000 2018-02-16 17:38:23.346 farads 0.0004100000 2018-02-16 17:39:04.611 farads 0.0002400000 2018-02-16 17:39:46.119 farads 0.0000700000 2018-02-16 17:40:33.633 farads 0.0001500000 2018-02-16 17:41:13.307 farads 0.0001500000 2018-02-16 17:41:13.308 farads 0.0001500000 2018-02-16 17:41:54.643 farads 0.0003100000 2018-02-16 17:42:33.994 farads 0.0002300000 2018-02-16 17:43:14.389 farads 0.0004000000 2018-02-16 17:43:54.324 farads 0.0002200000 2018-02-16 17:44:36.122 farads 0.0001800000 2018-02-16 17:45:16.828 farads 0.0002600000 2018-02-16 17:45:59.158 farads 0.0001500000 2018-02-16 17:46:45.126 farads 0.0000700000 2018-02-16 17:47:25.236 farads 0.0004400000 2018-02-16 17:48:12.096 farads 0.0002200000 2018-02-16 17:49:01.891 farads 0.0001600000 2018-02-16 17:49:50.422 farads 0.0002100000 2018-02-16 17:50:31.222 farads 0.0001300000 2018-02-16 17:51:12.651 farads 0.0002600000 2018-02-16 17:51:12.652 farads 0.0002600000 2018-02-16 17:51:53.478 farads 0.0001300000 2018-02-16 17:52:34.145 farads 0.0004600000 2018-02-16 17:53:14.374 farads 0.0003300000 2018-02-16 23:53:53.906 farads 0.0002600000 2018-02-16 23:54:34.453 farads 0.0001200000 2018-02-16 23:55:15.512 farads 0.0001600000 2018-02-16 23:55:58.161 farads 0.0001800000 2018-02-16 23:56:46.602 farads 0.0002600000 2018-02-16 23:57:26.829 farads 0.0003100000 2018-02-16 23:57:26.830 farads 0.0003100000 2018-02-16 23:58:06.991 farads 0.0004400000 2018-02-16 23:58:47.104 farads 0.0003600000 2018-02-16 23:58:47.105 farads 0.0003600000 2018-02-16 23:59:27.080 farads 0.0002300000 2018-02-17 00:00:07.008 farads 0.0002900000 2018-02-17 00:00:07.009 farads 0.0002900000 2018-02-17 00:00:51.685 farads 0.0004900000 2018-02-17 00:01:30.835 farads 0.0003000000 2018-02-17 00:02:14.187 farads 0.0004300000 2018-02-17 00:02:56.048 farads 0.0004700000 2018-02-17 00:03:39.758 farads 0.0004200000 2018-02-17 00:04:19.990 farads 0.0001600000 2018-02-17 00:04:59.854 farads 0.0001700000 2018-02-17 00:05:40.967 farads 0.0001400000 2018-02-17 00:06:24.584 farads 0.0001000000 2018-02-17 00:07:04.742 farads 0.0002500000 2018-02-17 00:07:48.107 farads 0.0003600000 2018-02-17 00:08:31.136 farads 0.0000700000 2018-02-17 00:09:12.429 farads 0.0001500000 2018-02-17 00:09:59.567 farads 0.0002500000 2018-02-17 00:10:41.062 farads 0.0001900000 2018-02-17 00:11:21.016 farads 0.0001600000 2018-02-17 00:12:00.863 farads 0.0001600000 2018-02-17 00:12:41.023 farads 0.0002400000 2018-02-17 00:13:22.429 farads 0.0001500000 2018-02-17 00:14:04.826 farads 0.0004100000 2018-02-17 00:14:51.079 farads 0.0001600000 2018-02-17 00:15:31.247 farads 0.0003500000 2018-02-17 00:16:17.396 farads 0.0001900000 2018-02-17 00:16:56.912 farads 0.0002100000 2018-02-17 00:17:37.895 farads 0.0001800000 2018-02-17 00:18:18.354 farads 0.0003700000 2018-02-17 00:18:58.071 farads 0.0004700000 2018-02-17 18:19:38.135 farads 0.0002000000 2018-02-17 18:20:22.373 farads 0.0002600000 2018-02-17 18:21:02.161 farads 0.0003000000 2018-02-17 18:21:43.806 farads 0.0002700000 2018-02-17 18:22:25.394 farads 0.0002500000 2018-02-17 18:23:06.549 farads 0.0003100000 2018-02-17 18:23:46.638 farads 0.0002100000 2018-02-17 18:24:27.966 farads 0.0001800000 2018-02-17 18:25:11.832 farads 0.0002800000 2018-02-17 18:25:52.344 farads 0.0003000000 2018-02-17 18:26:33.672 farads 0.0002600000 2018-02-17 18:27:15.499 farads 0.0004300000 2018-02-17 18:27:55.288 farads 0.0004800000 2018-02-17 18:28:56.699 farads 0.0004200000 2018-02-17 18:29:40.909 farads 0.0002100000 2018-02-17 18:30:20.942 farads 0.0003400000 2018-02-17 18:31:03.937 farads 0.0003500000 2018-02-17 18:31:51.329 farads 0.0002500000 2018-02-17 18:32:32.608 farads 0.0005000000 2018-02-17 18:33:12.869 farads 0.0004900000 2018-02-17 18:33:52.725 farads 0.0002300000 2018-02-17 18:34:39.022 farads 0.0001300000 2018-02-17 18:35:20.579 farads 0.0002800000 2018-02-17 18:36:00.487 farads 0.0002400000 2018-02-17 18:36:51.908 farads 0.0004500000 2018-02-17 18:37:33.667 farads 0.0002500000 2018-02-17 18:38:13.989 farads 0.0004700000 2018-02-17 18:38:53.753 farads 0.0003500000 2018-02-17 18:39:34.052 farads 0.0004100000
這是一個使用 awk 和 GNU 日期的選項;它用於
date
從日期和時間欄位中以小數秒為單位計算時間戳的“繁重工作”;awk 然後將每條記錄儲存在由該時間戳索引的數組中。這樣做的一個副作用是重複記錄被“刪除”——只為16:45:29.557
條目返回結果。在計算所有以秒為單位的時間戳之後,我們遍歷記錄,從每個條目中尋找與“+5 分鐘”最接近的匹配。如果最近的條目的時間戳差異小於 2 分鐘(從 5 分鐘的目標),那麼我們列印相應的日期和時間以及法拉讀數(只需將字元串“法拉”替換為空字元串);否則我們根據您的評論列印“NA”欄位. 這是與您的規範的偏差,假設給定記錄的匹配條目可能是“明天”。{ 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] } } }
樣本輸入的輸出(未排序):
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
…並通過管道傳輸到
|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
在擴展輸入上執行的腳本輸出是:
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
**注意:**當我最初發布此內容時,程式碼有一個錯誤,導致整點前五分鐘的時間與其對應的稍後時間不匹配。由於當時我沒有時間修復錯誤,因此我刪除了文章,但現在應該修復錯誤,並且我已經取消刪除了答案。但是,由於您只提供了一行預期輸出,請注意針對更廣泛的範例輸入集測試此程式碼。
你說你並不擔心 CPU 時間,但我最初的嘗試只是通過將每一行與每一行進行比較來強制它在 1800 行文件上執行需要 30 秒,所以我用
%mins
雜湊優化它,鍵時間精確到分鐘,因此只考慮每個時間戳的 +4、+5 和 +6 分鐘的分鐘數。這個版本需要約 4 秒才能在約 4000 行輸入文件上執行。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"; }
您的原始樣本輸入:
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
該輸入的輸出:
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
這是一個更快但不太準確的版本,它忽略毫秒並使用核心模組
Time::Piece
而不是有些沉重DateTime
(儘管我仍然強烈推薦後者)。與上述相比,執行只需幾分之一秒。您可以看到準確度的差異,但您確實說過 ± 1 分鐘是可以接受的。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"; }
輸出:
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
(請注意,我通常不會為沒有程式碼的問題提供完整的解決方案,但這對我來說是一個有趣的問題。)