For loop 用于在awk中循环以比较文件中的后续行
我之前问过如何使用awk纠正计数数据中的错误,其中我的数据的第一列是用于识别正在测量的子竞技场的数字,第二列是来自该子竞技场的计数数据。计数是自动进行的,程序会出错(下面用#表示),有时会出现“计数错误”,因为正在计数的动物已经移动到特定子竞技场的范围之外For loop 用于在awk中循环以比较文件中的后续行,for-loop,awk,For Loop,Awk,我之前问过如何使用awk纠正计数数据中的错误,其中我的数据的第一列是用于识别正在测量的子竞技场的数字,第二列是来自该子竞技场的计数数据。计数是自动进行的,程序会出错(下面用#表示),有时会出现“计数错误”,因为正在计数的动物已经移动到特定子竞技场的范围之外 1 0 1 2 1 6 1 7 1 7 1 8 1 7 # 1 7 # 1 9 2 0 2 0 2
1 0
1 2
1 6
1 7
1 7
1 8
1 7 #
1 7 #
1 9
2 0
2 0
2 1
2 4
2 3 #
2 3 #
2 4
2 4
2 6
我想这样更正上面的问题:
1 0
1 2
1 6
1 7
1 7
1 8
1 8
1 8
1 9
2 0
2 0
2 1
2 4
2 4
2 4
2 4
2 4
2 6
好心地建议的代码没有包含用于在每个竞技场的数据中进行更正的for循环(每个文件总共有20个),我一直在尝试解决这个问题,但我遇到了难以置信的困难,有时出现语法错误,有时出现非法语句错误。我希望得到任何关于以下内容不起作用的提示(对不起,我是一个新手,这是我尝试过的众多迭代之一,没有一个是漂亮的):
awk'i=1;i 1&$2outfile
如果行号增加,为什么不让另一个变量跟踪行号来重置p
,而不是计算行号:
awk '$1 > l { l = $1; p = 0 } $2 < p { $2 = p } { p = $2 } 1' input-file
awk'$1>l{l=$1;p=0}$2
首先,将第一个位置(
$1
)与l
变量(默认为0)中的值进行比较。如果大于该值,l
被设置为$1
,而p
被重置为0。然后,将第二个位置($2
)与p
进行比较,如果设置的p
。最后,p
被设置为(可能更改的)$2的值。最后的1
仅表示“打印”;否则,该命令将执行所有处理,但不会打印任何内容。效果非常好!只需添加“OFS=\\t”即可重置为制表符分隔。特别感谢你的解释!!
awk '$1 > l { l = $1; p = 0 } $2 < p { $2 = p } { p = $2 } 1' input-file