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

Bash将分隔文件中的所有整数减少一,bash,awk,sed,grep,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 输出文件示例: 2 3 4 5 6 7 1 3 5 1 2 3 4 5 6 0 2 4 你可以试试这个awk命令 awk '{for(i=1;i<=NF;i++){$i=$i-1}}1' infile &g

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

输入文件示例:

2 3 4 5 6 7
1 3 5
1 2 3 4 5 6
0 2 4
输出文件示例:

2 3 4 5 6 7
1 3 5
1 2 3 4 5 6
0 2 4

你可以试试这个awk命令

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

但是@Avinash Raj的建议更好

您可以在Bash循环中通过将文件的每一行读取到一个数组中来实现这一点

while read -ra line; do
    for i in ${!line[@]}; do
        let line[$i]--
    done
    echo ${line[@]}
done < file > output_file
读取时-ra行;执行
对于${!行[@]};中的i
让线[$i]--
完成
echo${line[@]}
完成output\u文件

A
perl
版本:

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

$ 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
  • -p
    假设
    while(){…}
    循环程序并打印行,就像sed一样
  • -e
    执行代码
  • s/(\d+)/$1-1/eg
    是一种简单的代换,我们将每个数字分组并对其执行减法。
    e
    标志评估代换。
    g
    标志执行全局代换

太好了。我对你的答案投了赞成票。我也会接受它。这似乎很复杂。你的努力仍然是+1。UNIX shell是一个调用工具的环境。用于操作文本文件内容的标准UNIX工具是awk。每当你发现自己在shell中编写循环来操作文本文件的内容时,你都有错误的答案方法和最终结果总是比awk解决方案更长、更复杂、更慢和/或更不健壮。@Ed Morton,我完全同意你的观点。但是,当你需要同时使用文本文件和运行一些过程时,会有相当大的问题。因此,请记住,你可以在shell als中执行相同的操作o、 但是你说得对,这很尴尬。而且这看起来也很复杂。学习新东西还是很好的。+1对于你的努力。+1,虽然我是一个蟒蛇学家,但我总是喜欢爷爷
perl
解决方案;-)