同じ数字を持つすべての行で数字を増やす方法

同じ数字を持つすべての行で数字を増やす方法

サンプルファイルは次のとおりです。

test test test test test
TEST: 15000
abcabc TEST: 15000 testtest test
TEST: 15000
test test  test 14000 test test test
TEST: 15000
TEST: 15000

15000が表示されている場合は、テキストが何であれ必要があります。各行に1を追加するだけです。

test test test test test
TEST: 15001
abcabc TEST: 15002 testtest test
TEST: 15003
test test  test 14000 test test test
TEST: 15004
TEST: 15005

ベストアンサー1

そしてperl

$ cat file
TEST: 15000
TEST: 15000
TEST: 15000 15000 -15000 015007 15000e-1 1.15000
OTHER: 1000 1000 1000
AND: 1000 1000 0x14999 14999
$ perl -pe 's{\d+}{$& + ++$c{$&}}ge' file
TEST: 15001
TEST: 15002
TEST: 15003 15004 -15005 15008 15006e-2 3.15007
OTHER: 1001 1002 1003
AND: 1004 1005 1x15000 15001
$ perl -pe 's{\d+}{$& + $c{$&}++}ge' file
TEST: 15000
TEST: 15001
TEST: 15002 15003 -15004 15007 15005e-1 2.15006
OTHER: 1000 1001 1002
AND: 1003 1004 0x14999 15000

10進数シーケンスのみを処理します。したがって、入力が正の10進整数ではない場合、上記のように期待した結果が得られない可能性があります。

上記の015000はまだ10進数(8進数ではない)と見なされますが、比較が数字ではない語彙であるため、15000と同じと見なされません。数値比較の$c{$&}ために次のように置き換えます(各一意の数値の増分を記憶する$c{0+$&}連想配列のキーとして使用される数値を正規化することによって)。%c

すべての数字を区別することが目的であれば、そうしないことに注意してください。 15000 の最初の発生がどのように上から 14999 の 2 番目の発生と同じ数に変換されるかを確認します。

また、2 64 - 1(18446744073709551615)より大きい数字は科学的表記法で表され、精度が低下します。 Addは-Mbignumランダムに大きな数を処理できますが、タスクに1を挿入してbignumに変換する必要があります。

$ perl -pe 's{\d+}{$& + ++$c{$&}}ge' <<< 99999999999999999999
1e+20
$ perl -Mbignum -pe 's{\d+}{0 + $& + ++$c{$&}}ge' <<< 99999999999999999999
100000000000000000000

おすすめ記事