【发布时间】:2012-12-09 09:56:10
【问题描述】:
我想使用 awk 命令比较文件中的连续行。这是输入和输出的示例。
输入文件
6
7
8
9
10
4
5
6
我想要的输出文件是这样的:
6
7
8
9
10
14
15
16
基本上我想比较当前行是否大于前一行,并继续打印前一行和当前行。只要当前行小于前一行,就为后面的每一行添加一个值 (10)。
【问题讨论】:
我想使用 awk 命令比较文件中的连续行。这是输入和输出的示例。
输入文件
6
7
8
9
10
4
5
6
我想要的输出文件是这样的:
6
7
8
9
10
14
15
16
基本上我想比较当前行是否大于前一行,并继续打印前一行和当前行。只要当前行小于前一行,就为后面的每一行添加一个值 (10)。
【问题讨论】:
根据评论中的要求更新:
awk '{if ($1<prev) {offset++}; print ($1+(offset*10)); prev=$1}' input_file
现在,每次在连续行之间从较大的数字变为较小的数字时,增量偏移量都会增加 10。
【讨论】:
awk '$0<p{$0+=10} {p=$0} 1' file
【讨论】:
您必须将先前的值保存在变量中并与之进行比较:
awk '{ if ($0 < old) { $0 += 10; } print; old = $0; }'
【讨论】:
$1 代替$0(系统地)。还要注意,如果一行是28,下一行是9,那么输出值会是19,而不是29(所以你不能保证通过这个脚本后数据会单调递增)。
while 替换if。如果您在输入中有很多需要执行循环的情况,那么计算(乘法、除法等)比迭代更好(因为您基本上添加了足够多的 10 来制作当前行比上一行大,沿着$0 += 10 * int((old - $0 + ff) / 10); 的行,其中ff 是一个合适的软糖因素,我还没有坐下来研究)。