我有一个文件的日期如下,假设文件名是file1.txt:
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语法中得到一个错误,有什么方法可以解决这个问题吗?
iqxoj9l91#
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,我认为这是您不希望看到的。
awk
perl
python
$
insrf1ej2#
通常我想用awk来做这样的工作,下面是可能工作的代码
awk -F',' '{printf("%s\t%d\n",$1,$2+1)}' file1.txt
vhipe2zx3#
以下是如何使用awk执行此操作
awk -F, '{$2=$2+1}1' OFS=, file1.txt 2013-12-29,2
或者更简单(如果值为-1,则将生成文件)
-1
awk -F, '$2=$2+1' OFS=, file1.txt
要对文件的更改进行更改,请将其保存在其他位置(下面示例中的tmp),然后将其移回原始名称:
tmp
awk -F, '{$2=$2+1}1' OFS=, file1.txt >tmp && mv tmp file1.txt
或者使用GNU awk,你可以这样做来跳过临时文件:
awk -i include -F, '{$2=$2+1}1' OFS=, file1.txt
zpgglvta4#
另一个一行程序是:
$ expr `cat /tmp/file 2>/dev/null` + 1 >/tmp/file
如果文件不存在或文件不包含有效的数字,则此操作有效-在这两种情况下,文件都是使用值1(重新)创建的。
nwo49xxi5#
Bash one liner option with BC.示例:
$ echo 3 > test $ echo 1 + $(<test) | bc > test $ cat test 4
也适用于:
bc <<< "1 + $(<test)" > test
lsmepo6l6#
awk最适合您的问题,但您也可以在shell中进行计算如果你有多行,我在这里使用循环
#!/bin/bash IFS=, while read DATE NUM do echo $DATE,$((NUM+1)) done < file1.txt
6条答案
按热度按时间iqxoj9l91#
Sed需要正斜杠,而不是反斜杠。实际上,使用''会有很多有趣的问题,但快速解决方法应该是(也使用双引号,如下所示):
然而,我怀疑sed是否真的是这种情况下的正确工具。从长远来看,从
awk
到perl
再到python
的更完整的单一工具可能会更好地工作。请注意,我使用了
$
行尾匹配来确保您不会将2012替换为2022,我认为这是您不希望看到的。insrf1ej2#
通常我想用awk来做这样的工作,下面是可能工作的代码
vhipe2zx3#
以下是如何使用
awk
执行此操作或者更简单(如果值为
-1
,则将生成文件)要对文件的更改进行更改,请将其保存在其他位置(下面示例中的
tmp
),然后将其移回原始名称:或者使用GNU awk,你可以这样做来跳过临时文件:
zpgglvta4#
另一个一行程序是:
如果文件不存在或文件不包含有效的数字,则此操作有效-在这两种情况下,文件都是使用值1(重新)创建的。
nwo49xxi5#
Bash one liner option with BC.示例:
也适用于:
lsmepo6l6#
awk
最适合您的问题,但您也可以在shell中进行计算如果你有多行,我在这里使用循环