我有一个日期如下的文件,假设文件名为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语法中得到一个错误,有没有办法解决这个问题。提前谢谢。
答案 0 :(得分:12)
Sed需要正斜杠,而不是反斜杠。实际使用'\'时会出现多个有趣的问题,但快速修复应该是(使用双引号,如下所示):
oldnum=`cut -d ',' -f2 file1.txt`
newnum=`expr $oldnum + 1`
sed -i "s/$oldnum\$/$newnum/g" file1.txt
但是,我怀疑在这种情况下,sed是否真的是适合这项工作的工具。从awk
到perl
到python
的更完整的单一工具从长远来看可能会更好。
请注意,我使用了$
行尾匹配,以确保您没有将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