我想將 txt 檔案轉換為 xls/csv。
第一行應列印日期時間,第二行應列印剩餘的所有資料(從 tid 到下面範例中的表)
當 m 使用以下命令時
awk 'BEGIN{ OFS="\t"; print "DateTime,Error"}; NR > 1{print $1,$2;}' TMP.txt > Output.xls
它在第一行列印日期時間,但僅在下一列列印 tid。
誰能幫我列印第二列中剩餘的全部文本
記錄在文字檔:
2019-11-26T11:51:32.087-08:00 tid: JCA-work-instance:AQ Adapter-8 userId: <anonymous> 0 , APP: Service Bus Logging FlowId: 0000MtDbHiu8pmk5Szd9ic1TlVox0015xl RouteNode2, null, null, REQUEST Queried data from header table
還應考慮以下類型的日誌條目:
Nov 28, 2019 8:19:03 AM PST HTTP BEA-101019 [ServletContext[text] Servlet failed with an IOException.
Nov 28, 2019 8:22:40 AM PST [null, null, null, ERROR] error in service-callouterror service to get information
答案1
您看到的行為的原因是,預設情況下,awk
將WHITESPACE
(即空格、製表符)視為輸入欄位分隔符號。因此,每一個輸入檔案中被空格包圍的項目被視為單一“欄位”,並分配有自己的$<number>
內部變數。但是,您的awk
命令指示 awk
僅列印前兩個此類欄位($1
和$2
),在您的情況下是日期/時間字串和文字tid:
。
在您的特定情況下,最簡單的方法可能是sed
使用第一的製表符的空白,這應該給出所需的結果。
由於您還想包含標題行,因此以下內容應該有效(假設sed
正在使用 GNU):
sed -e '1 i\DateTime\tError' -e 's/ /\t/' TMP.txt > Output.txt
第一個表達式在行首插入一行文本,第二個表達式執行預期的「實際格式化」。
更新
對於您提供的附加字串格式,我將採用以下awk
方法sed
(請注意,我使用 GNU awk):
awk 'BEGIN{printf("DateTime\tError\n")} {match($0,"^([[:alpha:]]{3}[[:space:]]+[0123]?[[:digit:]],[[:space:]]+20[[:digit:]]{2}[[:space:]]+[01]?[[:digit:]]:[012345][[:digit:]]:[012345][[:digit:]][[:space:]]+[AP]M[[:space:]]+[[:alpha:]]+)[[:space:]]+([[:print:]]*)$", fields); printf("%s\t%s\n", fields[1], fields[2])}' TMP.txt > Output.txt
此正規表示式符合您指定的時間格式,後面跟著一個或多個空格,後面跟著任意可列印字符,直到行尾,並列印第一(...)
個子組、時間戳,然後 a \t
,然後是第二個子組(...)
子組,即「該行的其餘部分」。此外,BEGIN
錨點用於在頂部插入標題行。
由於這兩種情況都可能發生在同一個文件中,因此我們必須將它們組合成一個awk
程式:
BEGIN {
printf("DateTime\tError\n");
}
{
if (match($0,"^([[:alpha:]]{3}[[:space:]]+[0123]?[[:digit:]],[[:space:]]+20[[:digit:]]{2}[[:space:]]+[012]?[[:digit:]](:[012345][[:digit:]]){2}[[:space:]]+[AP]M[[:space:]]+[[:upper:]]+)[[:space:]]+([[:print:]]*)$", fields) == 0)
match($0,"^(20[[:digit:]]{2}-[01][[:digit:]]-[0123][[:digit:]][[:alpha:]][012][[:digit:]](:[012345][[:digit:]]){2}.[[:digit:]]{3}[+-][012][[:digit:]]:[012345][[:digit:]])[[:space:]]+([[:print:]]*)$", fields);
printf("%s\t%s\n", fields[1], fields[3]);
}
您可以呼叫上面的腳本xlsconvert.awk
,然後將其呼叫為
user@host$ awk -f xlsconvert.awk TMP.txt > Output.txt
請注意,這當然會在輸出中保留不同的時間戳格式。如果您想將其轉換為統一格式,您可能必須求助於 shell 腳本。