как выполнять математические операции над числами в файле, используя perl или awk?

Попробуйте это:dpkg --add-architecture i386 && apt-get update && apt-get install wine32

4
14.02.2021, 21:03
2 ответа

Использование awk с прогрессивной нарезкой вокруг запятой мы динамически воссоздаем поля.


awk -F: -v OFS=, '
{
  f1=$1 FS; f2=$2 OFS
  n=0; $0=""
  while (p=index(f2, OFS)) {
    $(++n) = 10 + substr(f2,1,p-1) 
    f2 = substr(f2, p+1)
  }
  $1=f1 $1
}1
' fileA.txt

Выход:

RS0255_RS0083:125,134,139,151,153,178,180,190
RS0343_RS0083:122,123,173,185,191
RS0343_RS0255:104,111,117,174,189,193

perl -pe '/:/g;
  s/\G(\d+)(\D)/($1+10).$2/ge;
'fileA.txt 

#alternatively 
perl -ne '
  print !$|-- ? $_ : s/\d+/$&+10/reg
     for /(.*:)(.*)/s;
' fileA.txt
3
18.03.2021, 22:30

Использование Raku (, ранее известное как Perl _6)

raku -pe 's:g/ <[:,]> <(\d+)> /{$/.Num + 10}/;' 

Ввод выборки:

RS0255_RS0083:115,124,129,141,143,168,170,180
RS0343_RS0083:112,113,163,175,181
RS0343_RS0255:94,101,107,164,179,183

Выход пример:

RS0255_RS0083:125,134,139,151,153,178,180,190
RS0343_RS0083:122,123,173,185,191
RS0343_RS0255:104,111,117,174,189,193

В этом случае я думаю, что я достигну от Раку (сестра детей Perl5 )по причинам, включая надежное обращение с численностью. Вкратце, глобальный s:global///замена выполняется выше и автоматически с использованием флага командной строки -pe. Regex ищет цифры, следующие либо в :COLON, либо ,запятой. Матч за пределами цифр выпадет за пределами маркеров <(...)>. В замене добавляется переменная $/до .Numи 10 добавлена.

[Примечание :Вам придется сделать немного больше работы для обработки десятичных точек и / или номеров -, содержащих -запятых].

FYI, вы можете сделать действительно приятно (читаемые )вещей с Rationals. Вот пример:

raku -pe 's:g/ <:Nd + [\c[FULL STOP]]>+ /{$/.Rat.numerator}\/{$/.Rat.denominator}/;'

ввод выборки:

 3, 6, 9, 12, 15, 18, 21, 24
 4, 8, 12, 16, 20
 0.5, 1.0, 1.5, 2.0, 2.5, 3.0
 0.25, 0.5, 0.75, 1.0, 1.25, 1.5
 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0

Выход пример:

 3/1, 6/1, 9/1, 12/1, 15/1, 18/1, 21/1, 24/1
 4/1, 8/1, 12/1, 16/1, 20/1
 1/2, 1/1, 3/2, 2/1, 5/2, 3/1
 1/4, 1/2, 3/4, 1/1, 5/4, 3/2
 1/5, 2/5, 3/5, 4/5, 1/1, 6/5, 7/5, 8/5, 9/5, 2/1

https://docs.raku.org/type/Rational
https://raku.org/

0
09.09.2021, 19:34

Теги

Похожие вопросы