我正在寻找一个perl/awk/sed
命令来自动增加第7列中的数字
文件knownfile.txt中的示例行:
该文件具有格式和7列。
today is a great day and it
is also an amazing day tomorrow now
blahblah foo today build number is 5928
我想保留所有格式,只需将5928
替换为5929
并保存文件
我试过了:
awk '/blahblah/{ $7++; print $0 }' filename > tmp && mv tmp filename
它会增加数字,我认为它会保留格式,但它只会将编辑过的行打印到文件中。
答案 0 :(得分:7)
$ cat file
today is a great day and it
is also an amazing day tomorrow now
blahblah foo today build number is 5928
$ awk '{sub(/[[:digit:]]+$/,$NF+1)}1' file
today is a great day and it
is also an amazing day tomorrow now
blahblah foo today build number is 5929
如果那样做不符合您的要求,那么请认真考虑您要发布的样本输入和预期输出,以及我们必须继续发布的所有内容。
答案 1 :(得分:6)
使用perl one-liner
perl -i -pe 's/(\d+)$/1+$1/e' knownfile.txt
答案 2 :(得分:0)
鉴于该数字始终位于该行的末尾,您可以在awk中执行此操作:
awk '/foo/{++$NF}1' file
其中file
是您要操作的文件。当行包含单词“foo”时,这只会增加最后一列的值。最后的1
表示执行默认操作,即打印该行。
要在文件上“就地”执行此操作,您必须跳过几个环节:
awk '/foo/{++$NF}1' file > tmp && mv tmp file
较新版本的gawk
支持就地编辑,但这可以在任何地方使用。
答案 3 :(得分:0)
$ perl -i -pe 's/\d+$/$&+($&>0)/e if /foo/' knownfile.txt
不会将-32
视为否定。
答案 4 :(得分:-1)
此脚本没有缺点。
use Fcntl;
my $fh;
open $fh,"+<$ARGV[0]";
while(<$fh>) {
if (/foo/) {
s/(-?\d+)/(($1 > 0) ? ($1+1) : $1)/ge;
}
$file .= $_;
}
seek($fh, 0, SEEK_SET);
print $fh $file;
close $fh;