日付(列1)と時間(列2)に基づいてデータを取得します。 2列の各日付には時間があります。列1の各日付に対して、6:00~21:50:08(日)と22:00:00~5:50:00(夕方)の時間に基づいて、すべてのフィールドを含む2つのファイルが作成されます。指定された時刻(date_dayとdate_night)に基づいて各日付に対して2つのファイルを取得します。
入力ファイル:
Date Time R1 R2 R3
03/10/2023 19:00:08 19.06 39.870 5.12
03/10/2023 19:10:08 18.87 39.970 4.98
03/10/2023 19:20:08 18.68 39.940 4.80
03/10/2023 19:30:08 18.84 40.110 5.01
03/10/2023 19:40:08 18.89 38.960 4.64
03/10/2023 19:50:08 18.60 39.100 4.43
03/10/2023 23:30:08 18.03 34.200 2.03
03/10/2023 23:40:08 17.94 33.930 1.84
03/10/2023 23:50:08 17.87 33.840 1.74
03/11/2023 00:00:08 17.75 33.790 1.61
03/11/2023 00:10:08 17.96 34.060 1.91
03/11/2023 00:20:08 18.13 33.690 1.91
03/11/2023 00:30:08 17.91 33.620 1.68
結果ファイル:
03/10/2023_day
Date Time R1 R2 R3
03/10/2023 19:00:08 19.06 39.870 5.12
03/10/2023 19:10:08 18.87 39.970 4.98
03/10/2023 19:20:08 18.68 39.940 4.80
03/10/2023 19:30:08 18.84 40.110 5.01
03/10/2023 19:40:08 18.89 38.960 4.64
03/10/2023_night
Date Time R1 R2 R3
03/10/2023 19:50:08 18.60 39.100 4.43
03/10/2023 23:30:08 18.03 34.200 2.03
03/10/2023 23:40:08 17.94 33.930 1.84
03/10/2023 23:50:08 17.87 33.840 1.74
03/11/2023_night
:
Date Time R1 R2 R3
03/11/2023 00:00:08 17.75 33.790 1.61
03/11/2023 00:10:08 17.96 34.060 1.91
03/11/2023 00:20:08 18.13 33.690 1.91
03/11/2023 00:30:08 17.91 33.620 1.68
昼と夜のファイルを取得するために、次のことを試しました。デートするたびにこの仕事を続けなければなりません。 :なしの数値を取得するために、コードの時間列から「:」を削除しました。誰でもこれをループに入れ、各日付に対して別々の昼と夜のファイルを持つことができますか?
awk '$1 ~ /03\/10\/2023/ && $2 >= 060000 && $2 <= 215000' data |sed 's/\t/,/g' > 03_10_23_day.csv
awk '$1 ~ /03\/10\/2023/ && $2 > 215000' data |sed 's/\t/,/g' > 03_10_23_night.csv
ベストアンサー1
使用幸せ(以前のPerl_6)
#OUTPUT A SPECIFIED 'TIME-OF-DAY' RANGE FOR ALL DATES IN FILE:
~$ raku -e 'my $hdr = get; my @a = lines.map: *.split(" "); \
my @b = do for @a { .[0..1].join("T").subst(/ (\d**2) \/ (\d**2) \/ (\d**4) /, {"$2-$0-$1"} ).DateTime, .[2..*] }; \
put $hdr; for @b { \
my $start = .[0].truncated-to("day") + Duration.new(21600); \
my $stop = .[0].truncated-to("day") + Duration.new(71408); \
put $_ if $_.[0] ~~ $start ..^ $stop };' file
上記(最初の答え)はRaku(Perlプログラミング言語の1つ)を使った方法です。 Rakuを使えば良い点の一つはISO-8601
日時内蔵されています。上記は入力ラインをフィルタリングして定義された範囲$start .. $stop
内で出力を提供します。範囲..^
演算子(キャレットを含む)は、出力からRHS時点を除外します。
#OUTPUT A 'TIME-OF-DAY' RANGE FOR A SPECIFIED DATE IN FILE:
~$ raku -e 'my $target_date = DateTime.new("2023-03-10"); \
say $target_date; my $hdr = get; \
my @a = lines.map: *.split(" "); my @b = do for @a { .[0..1].join("T").subst(/ (\d**2) \/ (\d**2) \/ (\d**4) /, {"$2-$0-$1"} ).DateTime, .[2..*] }; \
put $hdr; for @b { \
my $start = $target_date + Duration.new(21600); \
my $stop = $target_date + Duration.new(71408); \
put $_ if $_.[0] ~~ $start ..^ $stop };' file
具体的には、上記(2番目の回答)では、$target_date
「時間」範囲を定義し、その日付のみを出力に保持できます。
入力例(OPの例と最後に追加された2行):
Date Time R1 R2 R3
03/10/2023 19:00:08 19.06 39.870 5.12
03/10/2023 19:10:08 18.87 39.970 4.98
03/10/2023 19:20:08 18.68 39.940 4.80
03/10/2023 19:30:08 18.84 40.110 5.01
03/10/2023 19:40:08 18.89 38.960 4.64
03/10/2023 19:50:08 18.60 39.100 4.43
03/10/2023 23:30:08 18.03 34.200 2.03
03/10/2023 23:40:08 17.94 33.930 1.84
03/10/2023 23:50:08 17.87 33.840 1.74
03/11/2023 00:00:08 17.75 33.790 1.61
03/11/2023 00:10:08 17.96 34.060 1.91
03/11/2023 00:20:08 18.13 33.690 1.91
03/11/2023 00:30:08 17.91 33.620 1.68
03/12/2023 19:00:08 19.06 39.870 5.12
03/12/2023 19:10:08 18.87 39.970 4.98
出力例(1):
Date Time R1 R2 R3
2023-03-10T19:00:08Z 19.06 39.870 5.12
2023-03-10T19:10:08Z 18.87 39.970 4.98
2023-03-10T19:20:08Z 18.68 39.940 4.80
2023-03-10T19:30:08Z 18.84 40.110 5.01
2023-03-10T19:40:08Z 18.89 38.960 4.64
2023-03-12T19:00:08Z 19.06 39.870 5.12
2023-03-12T19:10:08Z 18.87 39.970 4.98
出力例(2):
2023-03-10T00:00:00Z
Date Time R1 R2 R3
2023-03-10T19:00:08Z 19.06 39.870 5.12
2023-03-10T19:10:08Z 18.87 39.970 4.98
2023-03-10T19:20:08Z 18.68 39.940 4.80
2023-03-10T19:30:08Z 18.84 40.110 5.01
2023-03-10T19:40:08Z 18.89 38.960 4.64
https://docs.raku.org/言語/temporal
https://docs.raku.org/type/DateTime
https://raku.org