請幫我優化 bash 腳本。執行需要太多時間。
要求:
我正在使用的日志檔案有一些行的開頭帶有日期的行,而有些行的開頭沒有日期。
如果行首沒有日期,我需要從上一行插入日期。
我在 Windows 10 下的 MingW64 作業。
日期格式:2022-06-09 17:47:08,371
給定檔案:
date1 string1
string2 date(只是日志中的一個日期,而不是行首的日期)
,
string3 date2 string4 string5
]
string6
date3 string7
date4 string8
date5 string9
給定檔案的示例:
2022-06-09 10:00:01,000 string1
string2 2022-06-09 10:00:01,000 string2 2022 string2
, string3 string3 string3
2022-06-09 10:00:02,000 string4
string5
]string6 string6 string6
}
2022-06-09 10:00:03,000 string7 string7
2022-06-09 10:00:04,000 string8 string8
2022-06-09 10:00:05,000 string9
預期檔案:
date1 string1
date1 string2 date
date1 , string3 date2 string4
date2 string5 date2
]
string6
date3 string7
date4 string8
date5 string9
給定檔案的示例:
2022-06-09 10:00:01,000 string1
2022-06-09 10:00:01,000 string2 2022-06-09 10:00:01,000 string2 2022 string2
2022-06-09 10:00:01,000 , string3 string3 string3
2022-06-09 10:00:02,000 string4
2022-06-09 10:00:02,000 string5
2022-06-09 10:00:02,000 ]string6 string6 string6
2022-06-09 10:00:02,000 }
2022-06-09 10:00:03,000 string7 string7
2022-06-09 10:00:04,000 string8 string8
2022-06-09 10:00:05,000 string9
我的腳本需要優化
我嘗試了以下方法:
我用回圈做了,它很慢
nn_lines_to_replace=$(grep -Evn "^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}" "$file" | cut -d ":" -f1)
for nn_line in $nn_lines_to_replace ; do
replace=$(sed -n $(($nn_line-1))p "$file"|cut -d " " -f1-2)
sed -i ""$nn_line" s/^/$replace/" "$file"
done
也許可以用sed或awk來完成。
如果您有如何優化它的想法或有更好的方法,請分享,我將非常感謝任何幫助
更新: 我把這個問題鏈接的條件復雜化了
uj5u.com熱心網友回復:
我在評論中給出了下一個解決方案,它適用于 OP:
您的解決方案應該在檔案中回圈一次。對于每一行,檢查一個日期并將其放在一個 var 中,當它是一個日期時,或者使用 var 寫入最后一個日期。您可以使用
awk '
/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}/ {last_d_t=$1 " " $2; print; next}
{print last_d_t $0}
' inputfile
uj5u.com熱心網友回復:
我會AWK按照以下方式利用 GNU 來完成這項任務,讓file.txt內容成為
2022-06-09 10:00:01,000 string1
string2 2022-06-09 10:00:01,000 string2 2022 string2
, string3 string3 string3
2022-06-09 10:00:02,000 string4
string5
]string6 string6 string6
}
2022-06-09 10:00:03,000 string7 string7
2022-06-09 10:00:04,000 string8 string8
2022-06-09 10:00:05,000 string9
然后
awk '/^20[0-9][0-9]-[0-9][0-9]-[0-9][0-9]/{d=substr($0, 1, 24);print;next}{print d $0}' file.txt
輸出
2022-06-09 10:00:01,000 string1
2022-06-09 10:00:01,000 string2 2022-06-09 10:00:01,000 string2 2022 string2
2022-06-09 10:00:01,000 , string3 string3 string3
2022-06-09 10:00:02,000 string4
2022-06-09 10:00:02,000 string5
2022-06-09 10:00:02,000 ]string6 string6 string6
2022-06-09 10:00:02,000 }
2022-06-09 10:00:03,000 string7 string7
2022-06-09 10:00:04,000 string8 string8
2022-06-09 10:00:05,000 string9
說明:對于以后跟 2 位數字后跟 2 位數字后跟 2 位數字開頭的行20,-我-使用函式提取 24 個第一個字符substr并將其存盤在變數d中,print按原樣行并指示 GNUAWK轉到next行,因此第二個動作適用于與所述正則運算式不匹配的所有行-對于它們,我將它們列印在變數d的值前面。免責宣告:此解決方案假定您正在使用 2000...2099 范圍內的日期,并且以所述正則運算式開頭的任何行都包含固定寬度的日期時間字串,并且對于沒有日期時間字串的每一行,都存在早于日期時間的行。
(在 gawk 4.2.1 中測驗)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/491273.html
