[英]Print file in particular order in awk
我正在關注此鏈接https://stackoverflow.com/a/54599800/10220825
file.txt的
Iteration 1
RAM: +2s
Cache: +142ms (total +417ms)
Iteration 2
RAM: +184ms
Cache: +172ms
Searchms: +131ms (total +385ms)
Iteration 3
RAM: +149ms
Searchms: +3.2s
我想從時間值中刪除ms or s
,但不從名稱中刪除(例如,它不應刪除Searchms到Search)。 另外,如果時間值包含s
,我想通過multiply into 1000
將s into ms
轉換s into ms
並相應地打印結果。
預期產量:
RAM: 2000 184 149
Cache: 142 172
Searchms: 131 3200
try.awk
/:/{vals[$1]=vals[$1] OFS $2+0}
END {
for (key in vals)
print key vals[key]
}
執行時: awk -f try.awk file.txt
代碼輸出:
Cache: 142 172
Searchms: 131 3.2
RAM: 2 184 149
在我的輸出中, s is not converting to ms.
請建議我如何修改上述源代碼try.awk
將s轉換為ms。
新的測試用例: file.txt
Iteration 1
RAM: +2s342ms
Iteration 2
RAM: +2s
Iteration 3
RAM: +149ms
碼:
/:/ && $2 ~/ms$/{vals[$1]=vals[$1] OFS $2+0;next}
/:/ && $2 ~/[^m]s$/{vals[$1]=vals[$1] OFS ($2+0)*1000}
END {
for (key in vals)
print key vals[key]
}
預期產量:
RAM: 2342 2000 149
輸出:
RAM: 2 2000 149
您可以使用以下awk
腳本:
/:/ && $2 ~/ms$/{vals[$1]=vals[$1] OFS $2+0;next}
/:/ && $2 ~/[^m]s$/{vals[$1]=vals[$1] OFS ($2+0)*1000}
END {
for (key in vals)
print key vals[key]
}
這將產生輸出:
awk -f try.awk file.txt
Cache: 142 172
Searchms: 131 3200
RAM: 2000 184 149
說明:
$2 ~/ms$/
將檢查如果我們有一個線ms
在這種情況下,相同的邏輯作為之前完成和next
將迫使awk
跳轉到下一行。 /:/ && $2 ~/[^m]s$/{vals[$1]=vals[$1] OFS ($2+0)*1000}
當我們到達此范圍時,我們知道我們有一條線,單位為s
和我們將其乘以1000即可將其轉換為ms
。 為了滿足您的新要求,我將try.awk
為:
/:/ && $2 ~/[0-9]+s[0-9]+ms$/{split($2,buff,/s/);vals[$1]=vals[$1] OFS (buff[1]+0)*1000+buff[2];next}
/:/ && $2 ~/ms$/{vals[$1]=vals[$1] OFS $2+0;next}
/:/ && $2 ~/[^m]s$/{vals[$1]=vals[$1] OFS ($2+0)*1000}
END {
for (key in vals)
print key vals[key]
}
輸入:
$ cat file2.txt
Iteration 1
RAM: +2s342ms
Iteration 2
RAM: +2s
Iteration 3
RAM: +149ms
輸出:
$ awk -f try.awk file2.txt
RAM: 2342 2000 149
OP的小改編:
/:/{ vals[$1]=vals[$1] OFS $2*($2~/ms$/ ? 1 : 1000 ) }
END { for (key in vals) print key vals[key] }
備注:這不適用於所有版本的awk,這利用了gawk(和POSIX)的以下出色功能:
通過將字符串的任何數字前綴解釋為數字,可以將字符串轉換為數字:“ 2.5”轉換為2.5,“ 1e3”轉換為1,000, “ 25fix”的數字值為25 。 無法解釋為有效數字的字符串將轉換為零。
此行為是Posix有效的,並使用C函數atof
起作用。 但是,POSIX提供了將字符串轉換為數字的第二個選項,其中“ 25fix”將轉換為0。例如,在Oracle上就是這種情況:
Linux: GNU $ awk 'BEGIN{print "25fix"+0}'
25
SUN OS: SUNWesu $ /usr/bin/awk 'BEGIN{print "25fix"+0}'
0
SUN OS: SUNWxpg $ /usr/xpg4/bin/awk 'BEGIN{print "25fix"+0}'
25
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.