如何增加文件中的数字

时间:2013-12-30 08:50:00

标签: shell sed numbers increment

我有一个日期如下的文件,假设文件名为file1.txt

2013-12-29,1

这里我必须将数字增加1,所以它应该是1 + 1 = 2之类的..

2013-12-29,2 

我尝试使用'sed'替换,但必须只使用变量。

oldnum=`cut -d ',' -f2 file1.txt`  
newnum=`expr $oldnum + 1`
sed -i 's\$oldnum\$newnum\g' file1.txt  

但是我从sed语法中得到一个错误,有没有办法解决这个问题。提前谢谢。

6 个答案:

答案 0 :(得分:12)

Sed需要正斜杠,而不是反斜杠。实际使用'\'时会出现多个有趣的问题,但快速修复应该是(使用双引号,如下所示):

oldnum=`cut -d ',' -f2 file1.txt`  
newnum=`expr $oldnum + 1`
sed -i "s/$oldnum\$/$newnum/g" file1.txt 

但是,我怀疑在这种情况下,sed是否真的是适合这项工作的工具。从awkperlpython的更完整的单一工具从长远来看可能会更好。

请注意,我使用了$行尾匹配,以确保您没有将2012替换为2022,这是我认为您不想要的。

答案 1 :(得分:6)

通常我想用awk做这样的工作 以下是可能有效的代码

awk -F',' '{printf("%s\t%d\n",$1,$2+1)}' file1.txt

答案 2 :(得分:1)

她是如何使用awk

来完成的
awk -F, '{$2=$2+1}1' OFS=, file1.txt
2013-12-29,2

或更简单(如果值为-1

,则会提交
awk -F, '$2=$2+1' OFS=, file1.txt

要对文件进行更改:

awk -F, '{$2=$2+1}1' OFS=, file1.txt >tmp & mv tmp file1.txt

答案 3 :(得分:0)

awk最适合您的问题,但您也可以在shell中进行计算

如果你有多行,我在这里使用循环

#!/bin/bash
IFS=,
while read DATE NUM
do
echo $DATE,$((NUM+1))
done < file1.txt

答案 4 :(得分:0)

另一种单线方式  expr cat /tmp/file 2>/dev/null + 1&gt; / tmp / file

如果文件不存在或文件不包含有效数字,则此方法有效 - 在这两种情况下,文件都是(重新)创建的值为1

答案 5 :(得分:0)

用 BC 打击一个班轮选项。示例:

$ echo 3 > test
$ echo 1 + $(<test) | bc > test
$ cat test
4

也有效:

bc <<< "1 + $(<test)" > test