【发布时间】:2014-09-25 06:43:26
【问题描述】:
我有一个仅包含整数的空格分隔文件。每行都有从 1 开始的不同数量的整数。有没有一种方法可以使用一个 awk、sed、grep 或任何组合来实际创建另一个文件,该文件与所有整数减一时完全相同?该文件也没有空行。
输入文件示例:
2 3 4 5 6 7
1 3 5
输出文件示例:
1 2 3 4 5 6
0 2 4
【问题讨论】:
我有一个仅包含整数的空格分隔文件。每行都有从 1 开始的不同数量的整数。有没有一种方法可以使用一个 awk、sed、grep 或任何组合来实际创建另一个文件,该文件与所有整数减一时完全相同?该文件也没有空行。
输入文件示例:
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
示例:
$ 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
【讨论】:
您可以在 Bash 循环中通过将文件的每一行读入一个数组来执行此操作。
while read -ra line; do
for i in ${!line[@]}; do
let line[$i]--
done
echo ${line[@]}
done < file > output_file
【讨论】:
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 的建议更好
【讨论】:
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 标志执行全局替换。 【讨论】:
perl 解决方案 ;-)