Bash将分隔文件中的所有整数减少一
我有一个仅包含整数的空格分隔文件。每行从1开始有不同数量的整数。有没有一种方法可以使用一行awk、sed、grep或任何组合来创建另一个完全相同的文件,所有整数都减少一个?此文件上也没有空行 输入文件示例: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
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文件
Aperl
版本:
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
解决方案;-)