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

时间:2014-08-02 01:27:09

标签: bash awk sed grep

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

输入文件示例:

2 3 4 5 6 7
1 3 5

输出文件示例:

1 2 3 4 5 6
0 2 4

4 个答案:

答案 0 :(得分:4)

你可以试试这个awk命令,

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

示例:

$ 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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

但@Avinash Raj的建议更好

答案 3 :(得分:1)

perl版本:

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

<强>解释

  • -p假设while (<>) { ... }循环播放程序并打印该行,如sed。
  • -e执行代码
  • s/(\d+)/$1-1/eg是一个简单的替换,我们将每个数字分组并对其执行减法。 e标志评估替换。 g标志执行全局替换。