shell 如何增加文件中的编号

j9per5c4  于 2023-04-07  发布在  Shell
关注(0)|答案(6)|浏览(200)

我有一个文件的日期如下,假设文件名是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语法中得到一个错误,有什么方法可以解决这个问题吗?

iqxoj9l9

iqxoj9l91#

Sed需要正斜杠,而不是反斜杠。实际上,使用''会有很多有趣的问题,但快速解决方法应该是(也使用双引号,如下所示):

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

然而,我怀疑sed是否真的是这种情况下的正确工具。从长远来看,从awkperl再到python的更完整的单一工具可能会更好地工作。
请注意,我使用了$行尾匹配来确保您不会将2012替换为2022,我认为这是您不希望看到的。

insrf1ej

insrf1ej2#

通常我想用awk来做这样的工作,下面是可能工作的代码

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

vhipe2zx3#

以下是如何使用awk执行此操作

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

或者更简单(如果值为-1,则将生成文件)

awk -F, '$2=$2+1' OFS=, file1.txt

要对文件的更改进行更改,请将其保存在其他位置(下面示例中的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
zpgglvta

zpgglvta4#

另一个一行程序是:

$ expr `cat /tmp/file 2>/dev/null` + 1 >/tmp/file

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

nwo49xxi

nwo49xxi5#

Bash one liner option with BC.示例:

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

也适用于:

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

lsmepo6l6#

awk最适合您的问题,但您也可以在shell中进行计算
如果你有多行,我在这里使用循环

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

相关问题