我使用gawk gsub:
有以下bash代码replacedCount=$(gawk -v FILE_TMP="$FILE_TMP" -v OLD="$OLD" -v NEW="$NEW" '{ num += gsub( OLD, NEW ); print $0 > FILE_TMP; } END { print num }' "$FILE")
它用NEW替换所有OLD实例,并将结果输出到FILE_TMP - 替换次数在bash变量中捕获。
使用gawk gensub可以获得相同的结果吗?
我尝试了几种方法,大多数结果等于182,因为我想我计算的是0美元的出现次数。
我最接近的是:
replacedCount=$(gawk -v FILE_TMP="$FILE_TMP" -v OLD="$OLD" -v NEW="$NEW" '{ num[$0=gensub( OLD, NEW, "G" )]++; print $0 > FILE_TMP; } END { for (i in num) print num[i] }' "$FILE")
哪个输出到FILE_TMP正确。但是被替换的是:
replacedCount='8
1
1
1
1
1
1
8
1
8
8
1
1
1
8
1
1
1
1
1
1
1
1
8
8
1
1
1
8
1
1
8
1
1
1
1
1
1
1
1
8
8
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
8
1
8
1
1
1
8
1
1
8
8
1'
答案 0 :(得分:0)
以下匹配$ OLD作为执行gensub和增加" num"的门。计数器:
replacedCount=$(gawk -v FILE_TMP="$FILE_TMP" -v OLD="$OLD" -v NEW="$NEW" 'BEGIN { num=0 }; $0 ~ OLD { $0=gensub(OLD,NEW,"G"); num++ }; { print > FILE_TMP }; END { print num }' "$FILE")
如果需要每场比赛的计数(线内多次),我们将需要输掉" G"在gensub()中标记并将增量和gensub()放在while循环中。
replacedCount=$(gawk -v FILE_TMP="$FILE_TMP" -v OLD="$OLD" -v NEW="$NEW" 'BEGIN { num=0 }; { while ($0 ~ OLD) { $0=gensub(OLD,NEW,1); num++ } }; { print > FILE_TMP }; END { print num }' "$FILE")
gensub()主要是为了简化替换" Nth"匹配或不接触原件。在这个问题中,修改$ 0似乎是完全合理和自然的,并且使用gsub()和sub()更简洁明了,如下所示:
replacedCount=$(gawk -v FILE_TMP="$FILE_TMP" -v OLD="$OLD" -v NEW="$NEW" 'BEGIN { num=0 }; $0 ~ OLD { gsub(OLD,NEW); num++ }; { print > FILE_TMP }; END { print num }' "$FILE")
...或每次比赛的"增量"版本...
replacedCount=$(gawk -v FILE_TMP="$FILE_TMP" -v OLD="$OLD" -v NEW="$NEW" 'BEGIN { num=0 }; { while ($0 ~ OLD) { sub(OLD,NEW); num++ } }; { print > FILE_TMP }; END { print num }' "$FILE")