Busque dados com base na data (coluna 1) e na hora (coluna 2). Cada data possui hora na coluna 2. Com base em cada data da coluna 1 serão gerados dois arquivos que terão todos os campos baseados nos horários 6h00 às 21h50:08 (dia) e 22h00 às 5h: 50:00 (noite). Tentando obter dois arquivos para cada data como date_day e date_night com base nos horários especificados.
Arquivo de entrada:
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
Arquivos de saída:
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
Tentei o seguinte para buscar arquivos diurnos e noturnos. Terei que fazer isso em cada data repetidas vezes. Removi o ':' da coluna de tempo no meu código para obter um número sem :. Alguém pode ajudar a colocá-lo em um loop e separar os arquivos diurnos e noturnos para cada data?
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
Usando Raku (anteriormente conhecido como Perl_6)
Acima (primeira resposta) está uma abordagem usando Raku, um membro da família Perl de linguagens de programação. Uma vantagem de usar o Raku é que
ISO-8601
os DateTimes são integrados. Acima filtra as linhas de entrada, fornecendo saída dentro de um$start .. $stop
intervalo definido. O..^
operador de intervalo (com sinal de intercalação) exclui o ponto de tempo RHS da saída.Acima (segunda resposta), um pouco mais especificamente, você pode definir
$target_date
e reter apenas um intervalo de 'hora do dia' para essa data na saída.Entrada de amostra (exemplo do OP mais duas linhas extras adicionadas no final):
Exemplo de saída (1):
Exemplo de saída (2):
https://docs.raku.org/linguagem/temporal
https://docs.raku.org/type/DateTime
https://raku.org
Você deseja comparações de strings em vez de comparações de números
awk
e gera todos os arquivos de saída em umaawk
invocação. Usar um loop não faria sentido aqui:(
$2 >= "06" && $2 < "22"
também funcionaria aqui)Eu sugiro nomear seus arquivos
2023-10-03-night.csv
em vez de03_10_23_night.csv
(supondo que seja 3 de outubro e não 10 de março), o que significaria,ls
por exemplo, mostrá-los em ordem cronológica e esse2023-10-03
é um formato inequívoco de padrão internacional.Suposições/Entendimentos:
/
em datas usando_
(por exemplo,03/10/2023
torna-se03_10_2023
)DD_MM_YYYY_day
ouDD_MM_YYY_night
- de acordo com as saídas esperadas (ou seja, para esta resposta ignoraremos as.csv
extensões conforme mostrado no código de exemplo do OP)sed s/\t/,/g
)day
=06:00:00
para21:59:59
(vs OP:06:00:00
para21:50:08
???)night
=22:00:00
para05:59:59
(vs OP:22:00:00
para05:50:00
???)03/10/2023 19:50:08
entrada deve residir no_day
arquivo resultante e não no_night
arquivo (como o OP mostrou na saída esperada)0[0-5]
entradas (de manhã cedo) no_night
arquivo de data (em vez de a)_night
colocar no arquivo de data anterior ou b) colocar em um novo_morning
arquivo)Adicionando mais algumas linhas ao arquivo de entrada de amostra:
NOTA: arquivo não contém comentários
Uma
awk
ideia:Isso gera: