2017-08-01 49 views
0

我有一個日誌文件,姑且稱之爲mylogfile.txtR系統調用AWK失敗

格式是 日期戳,然後分號分隔符,然後一些其他的東西,我,爲這項工作的目的,漠不關心。

例如,(這是在日誌文件中的所有一行 - 不知道如何在SO表現爲這樣所以道歉)

20170710-23:59:43.158;[email protected]@[email protected]:15:[email protected]@2017071023:59:[email protected]@[email protected]:59:43.156#[email protected]@[email protected]:15:[email protected]@20170710-23:59:[email protected]@[email protected]:59:43.156#[email protected]@[email protected]:15:[email protected]@20170710-23:59:[email protected]@[email protected]:59:43.156#[email protected]@[email protected]:15:[email protected]@20170710-23:59:[email protected]@[email protected]:59:43.156# 

什麼我目前試圖簡單地說就是概念實例的證明。我希望解析文件,顛倒行順序,並返回輸出中的兩列 -

1)只是從第一列解析的時間戳(這是一個日期時間格式,所以我需要放棄日期部分)

2)在自午夜秒錶示即時間戳,表示以毫秒精度(符合時間戳本身的粒度。

從輸出下面的單線例子是例如

所以

23:59:43.158,86383.158 

我c一半在那裏。我可以使用在cygwin中完美運行的語法構造對awk的調用(自然地剝離了R包裝)。不過,這並不R內

testawk<-paste0("tac ", mylogfile.txt, " | awk 'BEGIN {FS=\"-|;|:\"} {OMFT=\"%.3f\"} {print $2 \":\" $3 \":\" $4 \",\" (3600*$2)+(60*$3)+$4}' ") 

getawk<-as.data.frame(system(testawk, intern=TRUE, show.output.on.console = FALSE)) 

工作,但是什麼數據幀getawk結束僅僅是原始日誌文件攪動通過,因爲它是被讀取。另外,我拿到運行命令有狀態1.

警告郵件,但是

,如果我去掉了「TAC」一塊,只使用直AWK,從而;

testawk<-paste0("awk 'BEGIN {FS=\"-|;|:\"} {OMFT=\"%.3f\"} {print $2 \":\" $3 \":\" $4 \",\" (3600*$2)+(60*$3)+$4}' ", mylogfile.txt) 

    getawk<-as.data.frame(system(testawk, intern=TRUE, show.output.on.console = FALSE)) 

我得到錯誤信息

Error in system(testawk, intern = TRUE, show.output.on.console = FALSE) : 'awk' not found

我不認爲這個問題是在我的awk的建設,因爲它工作正常,如果我只是做cygwin的範圍內。所以很明顯r/system/awk交互的一些方面我沒有完全掌握。我想如果我把它全部包裝在一個awk腳本中,並簡單地調用它的腳本它可能工作,但我很沮喪,我不能簡單地找到正確的語法來直接調用awk R系統命令(我處理grep,sed等命令等)。

這不像awk實際上根本不被支持那麼簡單嗎?

指針非常感謝。如果第一個說20行的日誌文件是有用的,我也可以發佈這些。

+1

爲什麼你想使用'awk'呢?你可以在沒有太多痛苦的情況下做到這一點。 – nicola

回答

1

當嘗試在R中使用其他語言時,經常會發生這種情況。蟒蛇。如果您尚未將路徑添加到Windows系統路徑,那麼您還沒有告訴RStudio在哪裏查找可執行文件。

Cygwin的根目錄通常位於C:\cygwin64(但可能因您的安裝而異),因此請查找安裝並查找bin文件夾。在應該有awk的可執行文件,但它通常只是一個符號鏈接到gawk可執行文件(身份驗證),以便添加到路徑,例如:

Sys.setenv(PATH = paste("C:/cygwin64/bin/gawk", Sys.getenv("PATH"), sep = ":")) 

注意:這不會永久添加,所以你必須啓動在每個會議開始時或add to your Windows path將其永久識別。

+0

/usr/bin/awk已返回。我會補充一點。謝謝(以及下面的海報)。 – Pascoe

+0

可悲的是沒有工作。仍然沒有找到awk錯誤。由於我在Windows窗口中運行所有這些,我是否需要更多'windowey'文件路徑? – Pascoe

+0

@Pascoe請參閱我的編輯 – mlegge

1

聽起來像'awk'根本找不到,也許它不在你的PATH中。嘗試將awk的完整路徑放入,例如'在/ usr /斌/的awk'。我沒有使用Windows和Cygwin,所以你的真正路徑肯定會有所不同。

0

只要做到這一切在R:

c(
    "20170710-10:31:26.121;[email protected]@[email protected]:15:[email protected]@2017071023:59:[email protected]@[email protected]:59:43.156#[email protected]@[email protected]:15:[email protected]@20170710-23:59:[email protected]@[email protected]:59:43.156#[email protected]@[email protected]:15:[email protected]@20170710-23:59:[email protected]@[email protected]:59:43.156#[email protected]@[email protected]:15:[email protected]@20170710-23:59:[email protected]@[email protected]:59:43.156#", 
    "20170710-23:59:43.158;[email protected]@[email protected]:15:[email protected]@2017071023:59:[email protected]@[email protected]:59:43.156#[email protected]@[email protected]:15:[email protected]@20170710-23:59:[email protected]@[email protected]:59:43.156#[email protected]@[email protected]:15:[email protected]@20170710-23:59:[email protected]@[email protected]:59:43.156#[email protected]@[email protected]:15:[email protected]@20170710-23:59:[email protected]@[email protected]:59:43.156#" 
) -> log_lines 

# you'd get the above with `log_lines <- readLines('filename')` 

matched <- stringi::stri_match_first_regex(log_lines, "([[:digit:]]+:[[:digit:]]+:[[:digit:]]+\\.[[:digit:]]+)")[,2] 

cat(
    rev(
    sprintf(
     "%s,%s\n", 
     matched, 
     lubridate::hms(matched) %>% 
     as.numeric() %>% 
     sprintf("%9.3f", .) 
    ) 
), 
    sep="" 
) 

這使得:

10:31:26.121,37886.121 
23:59:43.158,86383.158 

而且,您可以cat到文件或存儲在數據幀(等)。

我很高興可能對您更爲熟悉,但它絕對沒有意義使用它。

+0

謝謝。我知道如何在R中做這件事,但問題是如何調用awk。正如我前面所說,那個特殊的例子就是這個。一個例子。我還有其他用例。 – Pascoe