首页 文章

Bash将分隔文件中的所有整数减1

提问于
浏览
3

我有一个空格分隔文件,只包含整数 . 每一行都有不同数量的整数从1开始 . 是否有一种方法可以使用单个线程的awk,sed,grep或任何组合来实际创建另一个文件,它将完全相同,所有整数减少一个?此文件中也没有空行 .

输入文件示例:

2 3 4 5 6 7
1 3 5

输出文件示例:

1 2 3 4 5 6
0 2 4

4 回答

  • 2

    您可以通过将文件的每一行读入数组来在Bash循环中执行此操作 .

    while read -ra line; do
        for i in ${!line[@]}; do
            let line[$i]--
        done
        echo ${line[@]}
    done < file > output_file
    
  • 1

    你可以尝试这个awk命令,

    awk '{for(i=1;i<=NF;i++){$i=$i-1}}1' infile > outfile
    

    Example:

    $ cat file
    2 3 4 5 6 7
    1 3 5
    
    4 4 5
    $ awk '{for(i=1;i<=NF;i++){$i=$i-1}}1' file
    1 2 3 4 5 6
    0 2 4
    
    3 3 4
    
  • 4
    for DD in $(cat your_input_file|tr " " ",")
    do
       for x in $(echo $DD | tr "," " ")
       do
          let m=$x-1
          echo -n " $m" >>your_output_file
       done
       echo >>your_output_file
    done
    

    but @Avinash Raj's suggestion is better

  • 1

    A perl 版本:

    perl -pe 's/(\d+)/$1-1/eg' file
    1 2 3 4 5 6
    0 2 4
    

    Explanation:

    • -p 假设 while (<>) { ... } 循环程序并打印线,如sed .

    • -e 执行代码

    • s/(\d+)/$1-1/eg 是一个简单的替换,我们将每个数字分组并对其执行减法 . e flag评估替换 . g flag执行全局替换 .

相关问题