如何計算僅在 E* 之后的特定值之后出現的次數?例如:'EXXXX' ?
檔案.txt:
E2dd,Rv0761,Rv1408
2s32,Rv0761,Rv1862,Rv3086
6r87,Rv0761
Rv2fd90c,Rv1408
Esf62,Rv0761
Evsf62,Rv3086
我試過輸入:
awk -F, '{map[$2] } END { for (key in map) { print key, map[key] } }' file.txt
并添加:
if [[ $line2 == `E*` ]];then
但不作業,有語法錯誤
預期輸出:
total no of occurrences:
Rv0761: 2
Rv3086:1
現在我只能計算第二個值的所有出現次數
uj5u.com熱心網友回復:
if [[ $line2 == `E*` ]];then
這絕對不是合法的 GNU AWKif 陳述句,請查閱If 陳述句以查找允許的內容,盡管在這種情況下不需要,如下所示,讓file.txt內容為
E2dd,Rv0761,Rv1408
2s32,Rv0761,Rv1862,Rv3086
6r87,Rv0761
Rv2fd90c,Rv1408
Esf62,Rv0761
Evsf62,Rv3086
然后
awk 'BEGIN{FS=","}($1~/^E/){map[$2] } END { for (key in map) { print key, map[key] } }' file.txt
給出輸出
Rv3086 1
Rv0761 2
解釋:動作(包含在{...中})可以在前面加上模式,這確實將它們的執行限制在與模式匹配的行(換句話說:條件確實成立)在上面的示例模式中$1~/^E/,這意味著第一列確實以 . 開頭E。
(在 gawk 4.2.1 中測驗)
uj5u.com熱心網友回復:
rq( https://github.com/fuyuncat/rquery/releases ) 可以做到這一點。
它將找出所有以 E* 開頭的行,然后將以下單詞轉換為行并對它們進行分組和計數。
[ rquery]$ cat samples/efile.txt
E2dd,Rv0761,Rv1408
2s32,Rv0761,Rv1862,Rv3086
6r87,Rv0761
Rv2fd90c,Rv1408
Esf62,Rv0761
Evsf62,Rv3086
[ rquery]$ ./rq -q "p d/,/ | s coltorow(foreach(2,%,trim($))) | f @1 like 'E*'" samples/efile.txt | ./rq -q "s @raw,count(1) | g @raw"
Rv0761 2
Rv1408 1
Rv3086 1
uj5u.com熱心網友回復:
你是如此接近。您只是缺少 REGEX 來識別以開頭'E'然后":"連接輸出的記錄以產生您想要的結果(而不是按排序順序)。例如,您可以這樣做:
awk -F, '/^E/{map[$2] } END { for (key in map) { print key ":", map[key] } }' file.txt
示例輸出
使用您的資料,file.txt您將獲得:
Rv3086: 1
Rv0761: 2
如果您需要以某種方式對輸出進行排序,只需將awk命令的輸出通過管道傳輸到sort您需要的任何選項即可。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/521137.html
標籤:重击壳awk
