【问题标题】:How to increment number in a file如何增加文件中的数字
【发布时间】:2014-01-17 03:22:57
【问题描述】:

我有一个日期如下的文件,假设文件名为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 语法中得到一个错误,有什么办法吗?提前致谢。

【问题讨论】:

    标签: shell sed numbers increment


    【解决方案1】:

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

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

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

    请注意,我使用了 $ 行尾匹配来确保您没有将 2012 替换为 2022,我认为您不希望这样做。

    【讨论】:

    • 感谢您的快速回复..:) 我这里不需要 awk,因为这是一个小改动。它运行良好。
    • 没问题;不要忘记选择您最喜欢的回复并点击复选框接受它。
    • Sed 不需要正斜杠,它需要一个一致的分​​隔符。反斜杠只需要转义(加倍)才能真正到达 sed。
    【解决方案2】:

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

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

    【讨论】:

    • @Jotne 这给了我 1,1 用于其中值为 '1' 的文件。我无法增加数字。
    【解决方案3】:

    这是使用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
    

    【讨论】:

    • 感谢您的回复..:)
    • @Jotne - 在...,-1 上失败;最好保留大括号,也可能使输出明确:awk -F, '{$2=$2+1;print}' OFS=, ...
    • @HenkLangveld 大括号应该使用是,因为0 结果不会被打印。但据我所知{$2=$2+1;print}{$2=$2+1}1' 相同。
    • @Jotne - 正确,但是对于没有经验的人来说,孤独的1 我会被忽视(作为错字)。最好在答案中添加注释。
    • 这对我有用,尽管我必须在命令之间添加一个双 &。 awk -F, '{printf("%d\n",$1+1)}' nb.txt > nb2.txt && mv nb2.txt nb.txt(注意文件只有一个数字)
    【解决方案4】:

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

    如果你有不止一行,我在这里使用循环

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

        同样有效:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-13
          • 1970-01-01
          相关资源
          最近更新 更多