计算GNU awk gensub

时间:2015-10-28 15:54:37

标签: bash awk count gsub gawk

我使用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可以获得相同的结果吗?

  1. $ FILE长182行。
  2. 有8个$ OLD会被$ NEW
  3. 取代

    我尝试了几种方法,大多数结果等于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'
    

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")