Используйте perl или awk для поиска чисел в файле и увеличения их на постоянную величину из командной строки - PullRequest
1 голос
/ 27 сентября 2011

У меня есть файл с набором из 3-значных чисел, которые мне нужно увеличить на определенную величину (на самом деле, мне нужно увеличить все числа, которые превышают определенное значение, на постоянную величину).Как я могу сделать это как можно проще из командной строки?

РЕДАКТИРОВАТЬ: Чтобы уточнить, в файле больше текста, чем просто чисел, и их нелегко извлечь как поля в awk.

Ответы [ 4 ]

7 голосов
/ 27 сентября 2011

Вот пример, который возьмет каждое число (ну, положительное целое число) в файле больше 400 и добавит к нему 13.

perl -pe 's/\d+/$& > 400 ? $&+13 : $&/ge' file

\d+ - это регулярное выражение, которое будетсоответствовать любому целому числу в вашем тексте

$& - это специальная переменная Perl, которая содержит текст, которому соответствует регулярное выражение.В этом случае это будет число.

Модификатор /e указывает Perl оценить выражение замены.В этом случае он вычисляет $& > 400 ? $&+13 : $&, чтобы получить другое число.

Модификатор '/ g' заменяет все экземпляры регулярного выражения (целое число) в каждой строке.

3 голосов
/ 27 сентября 2011

Как насчет:

awk '$1>300{$1+=100;print $0}' file

Превращается:

/home/sirch>cat file
313
233
133
413

в:

/home/sirch>awk '$1>300{$1+=100}1' file
413
233
133
513
0 голосов
/ 27 сентября 2011

Предполагается, что файл состоит из трех цифр, разделенных новыми строками:

$ cat file|while read number;do
if [ $number -gt $minvalue ]; then
    echo $(($number+$constant))
else
    echo $number
fi
0 голосов
/ 27 сентября 2011

Это, вероятно, не оптимально компактно, но это первое, о чем я подумал:

perl -e 'my $file=$ARGV[0];my $amt_to_increase=$ARGV[1];
open(my $read,"<",$file) or die $!;my @lines=<$read>;close($read);
open(my $write,">","temp") or die $!;
foreach(@lines){print $write $_+$amt_to_increase . "\n";}
close($write);system("mv temp $file")==0 or die $!;' <file to read> <amount to add to each line>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...