我有一个包含3位数字的文件,我需要增加一定数量(实际上,我需要将所有大于某个值的数字增加一个恒定的数量)。如何从命令行尽可能简单地完成此操作?
编辑:澄清一下,文件中的文字多于数字,而且在awk中将它们作为字段提取并不容易。
答案 0 :(得分:7)
这是一个示例,它将采用大于400的文件中的每个数字(井,正整数)并向其添加13。
perl -pe 's/\d+/$& > 400 ? $&+13 : $&/ge' file
\d+
是正则表达式,它将匹配文本中的任何整数
$&
是一个特殊的Perl变量,包含正则表达式匹配的文本。在这种情况下,它将是一个数字。
/e
修饰符告诉Perl 评估替换表达式。在这种情况下,它会评估$& > 400 ? $&+13 : $&
以获得不同的数字。
'/ g'修饰符替换每行上正则表达式的所有实例(整数)。
答案 1 :(得分:3)
怎么样:
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
答案 2 :(得分:0)
这可能不是最佳的紧凑,但这是我想到的第一件事:
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>
答案 3 :(得分:0)
假设文件有3位数字,用换行符分隔:
$ cat file|while read number;do
if [ $number -gt $minvalue ]; then
echo $(($number+$constant))
else
echo $number
fi