【问题标题】:comparing consecutive rows in awk比较awk中的连续行
【发布时间】: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 compare


    【解决方案1】:

    根据评论中的要求更新

    awk '{if ($1<prev) {offset++}; print ($1+(offset*10)); prev=$1}' input_file
    

    现在,每次在连续行之间从较大的数字变为较小的数字时,增量偏移量都会增加 10。

    【讨论】:

    • 谢谢。我现在有第二种情况,我不仅要为第一种情况添加 (10),而且现在我必须为第二种情况添加 (20):输入文件 6 7 8 9 10 | 4 5 6 | 1 2 3 输出 6 7 8 9 10 | 14 15 16 | 21 22 23
    • @Yacob 查看更新的答案。这将持续 30、40、50 ... 等。
    【解决方案2】:
    awk '$0<p{$0+=10} {p=$0} 1' file
    

    【讨论】:

      【解决方案3】:

      您必须将先前的值保存在变量中并与之进行比较:

      awk '{ if ($0 < old) { $0 += 10; } print; old = $0; }'
      

      【讨论】:

      • 在此数据文件的上下文中,您可以使用$1 代替$0(系统地)。还要注意,如果一行是28,下一行是9,那么输出值会是19,而不是29(所以你不能保证通过这个脚本后数据会单调递增)。
      • 我不确定你在问什么,@Yacob,但一种可能是用while 替换if。如果您在输入中有很多需要执行循环的情况,那么计算(乘法、除法等)比迭代更好(因为您基本上添加了足够多的 10 来制作当前行比上一行大,沿着$0 += 10 * int((old - $0 + ff) / 10); 的行,其中ff 是一个合适的软糖因素,我还没有坐下来研究)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 2016-11-26
      相关资源
      最近更新 更多