如何在 Unix 中將 txt 編輯為 xls?

如何在 Unix 中將 txt 編輯為 xls?

我想將 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

您看到的行為的原因是,預設情況下,awkWHITESPACE(即空格、製表符)視為輸入欄位分隔符號。因此,每一個輸入檔案中被空格包圍的項目被視為單一“欄位”,並分配有自己的$<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 腳本。

相關內容