我有一個包含很多行的檔案。有些行顯示日期和時間,例如 2022-03-16-08:00
我希望找到的模式后面的所有行都在前面加上該模式
此外,由于有許多行具有不同的時間,我希望對模式的每個實體都進行更改,并在該實體的以下行前面加上相應的日期和時間。
例如,我有以下檔案(example.txt):
Date1: 2022-03-16-08:00
Something happened
Something else happened
Date2: 2022-03-16-08:10
Something happened
Something else happened
Something else happened
我想要的結果是:
Date1: 2022-03-16-08:00
2022-03-16-08:00 Something happened
2022-03-16-08:00 Something else happened
Date2: 2022-03-16-08:10
2022-03-16-08:10 Something happened
2022-03-16-08:10 Something else happened
2022-03-16-08:10 Something else happened
我嘗試使用 sed 將找到的模式添加到其他行,但 sed 變數似乎不起作用:
sed -e '/2022-/s/\(.*\)/\1/' -e 's/^/$1/' example.txt
結果:
$1Date1: 2022-03-16-08:00
$1Something happened
$1Something else happened
$1Date2: 2022-03-16-08:10
$1Something happened
$1Something else happened
$1Something else happened
我認為使用 awk 可能是可行的,使用 awk -F: '/2022/{var=$2}' 獲取模式,然后將其添加到下一行,但我不知道如何將其更改為Date 的新實體
任何幫助表示贊賞和非常歡迎。
uj5u.com熱心網友回復:
使用sed:
sed -e '/: 2[0-9]\{3\}-/{p;s/.*: //;h;d;}' -e 'G;s/\(.*\)\n\(.*\)/\2 \1/' example.txt
uj5u.com熱心網友回復:
我會按照 GNUAWK的方式完成這項任務,讓file.txt內容成為
Date1: 2022-03-16-08:00
Something happened
Something else happened
Date2: 2022-03-16-08:10
Something happened
Something else happened
Something else happened
然后
awk 'BEGIN{FPAT="[0-9]{4}-[0-9]{2}-[0-9]{2}-[0-9]{2}:[0-9]{2}"}NF{when=$1;print}!NF{print when,$0}' file.txt
輸出
Date1: 2022-03-16-08:00
2022-03-16-08:00 Something happened
2022-03-16-08:00 Something else happened
Date2: 2022-03-16-08:10
2022-03-16-08:10 Something happened
2022-03-16-08:10 Something else happened
2022-03-16-08:10 Something else happened
解釋:在里面我使用(Field PATtern)BEGIN通知 GNU它應該將欄位視為以下字串:4 位數字后跟2 位數字后跟2 位數字后跟2 位數字后跟2 位數字,即時間戳符合您使用的格式。對于每一行,如果它確實包含這樣的檔案(即非零的欄位數) ,請為第一個這樣的欄位()的內容設定變數值,如果沒有這樣的欄位(即否定),則按原樣執行當前行of ) 然后列印變數值,后跟整個當前行 ( )。AWKFPAT---:NFwhen$1print!NFNFwhen$0
警告:我的代碼假設如果您在單行中有多個時間戳,則要使用第一個時間戳,并且第一行中總是有時間戳
(在 gawk 4.2.1 中測驗)
uj5u.com熱心網友回復:
此解決方案應適用于任何版本awk:
awk -F ': ' 'NF == 2 && $2 ~ /^20[0-9]{2}/ {
dt = $2; print; next} {print dt, $0}' file.log
Date1: 2022-03-16-08:00
2022-03-16-08:00 Something happened
2022-03-16-08:00 Something else happened
Date2: 2022-03-16-08:10
2022-03-16-08:10 Something happened
2022-03-16-08:10 Something else happened
2022-03-16-08:10 Something else happened
uj5u.com熱心網友回復:
使用您顯示的示例,請嘗試以下awk代碼。用 GNU 撰寫和測驗awk,應該可以在任何awk.
awk '
match($0,/[0-9]{4}(-[0-9]{2}){3}:[0-9]{2}/){
value=substr($0,RSTART,RLENGTH)
print
next
}
{
print value,$0
}
' Input_file
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/445471.html
