簡體   English   中英

以awk的特定順序打印文件

[英]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 1000s 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 無法解釋為有效數字的字符串將轉換為零。

來源: Gnu Awk手冊:字符串和數字的轉換

此行為是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM