Вероятно, использование некоторых UNIX команд будет наиболее "естественным", awk
и csplit
будут работать в этом отношении .
В любом случае, у меня есть решение R , Вместо использования readLines()
я бы начал с read.delim()
. Таким образом, вы начинаете с data.frame
, а затем можете использовать любые инструменты для манипуляции data.frame
. Я больше всего знаком с командами tidyverse, поэтому я бы использовал их здесь.
# Process File
library(tidyverse)
log_df <- read.delim(serverLog, header = FALSE) %>%
mutate(breakpoint = grepl("Monthly Breakpoint", V1),
breakdate = ifelse(breakpoint, gsub("Monthly Breakpoint, ", "", V1), NA)) %>%
fill(breakdate) %>%
mutate(breakdate = ifelse(is.na(breakdate), "before first breakdate", breakdate)) %>%
filter(!breakpoint) %>%
select(-breakpoint)
# Save Files
log_df %>%
split(.$breakdate) %>%
lapply(function(x) write.csv(x, file = paste(x$breakdate[1], ".csv"), row.names = FALSE))
Я не знаю, хотя, если хранение данных в отдельных файлах - лучший рабочий процесс, чтобы выбрать здесь. Почему бы просто не сохранить данные в R, разбить строки на несколько столбцов и сгруппировать анализ по месяцам.
РЕДАКТИРОВАТЬ: Вот как может выглядеть разбиение на столбцы и некоторый анализ.
# split / separate() into columns
log_sep_df <-
log_df %>%
as_tibble() %>%
mutate(V1 = substr(V1, 2, nchar(as.character(V1)))) %>%
separate(V1, into = c(paste0("var", 1:10)), sep = "\\[| | ") %>%
mutate(http = ifelse(grepl("POST", var1), "POST", "GET")) %>%
mutate(var1 = gsub("POST|GET", "", var1))
# get month labels
library(lubridate)
log_sep_df <-
log_sep_df %>%
mutate(date = as.Date(mdy(log_sep_df$breakdate)))
date_before_first_breakpoint <- min(log_sep_df$date, na.rm = TRUE) - 10
log_sep_df <-
log_sep_df %>%
mutate(date = if_else(is.na(date),
date_before_first_breakpoint,
date),
month = month(date, label = TRUE))
# grouped visiualization of logs
ggplot(log_sep_df, aes(http)) +
geom_bar() +
facet_wrap(~month)