for循环在awk中比较文件中的后续行

时间:2012-07-31 03:21:49

标签: 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
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<=20; i++; $1=i {NR > 1 && $2 < p {$2 = p} {p = $2} 1}' infile > outfile

1 个答案:

答案 0 :(得分:2)

为什么不使用另一个变量来跟踪行号,而不是计算行数,如果行号增加,则会重置p

awk '$1 > l { l = $1; p = 0 } $2 < p { $2 = p } { p = $2 } 1' input-file

首先将第一个位置($1)与l变量中的值(默认为0)进行比较。如果它更大,则l设置为$1p重置为0.然后将第二个位置($2)与p进行比较,并且如果它设置为p。最后,p设置为(可能已更改)$2的值。最终1只是意味着“打印”;否则命令会执行所有处理但不打印任何处理。