2012-07-31 74 views
0

我以前问过如何使用awk来更正计数数据中的错误,其中第一列数据是用于标识正在测量的子舞台的数字,第二列列是来自该子舞台的计数数据。计数是自动化的,程序出错(下面用#表示),偶尔会有“错误计数”,因为正在计数的动物已经移动到了特定子场的范围之外。for循环在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 

回答

2

而非线计数,为什么不具有另一个变量跟踪如果行号的增量可复位p的行号:

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

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

+0

它很好用!只需添加“OFS = \\ t”即可重置为制表符分隔。并特别感谢你的解释! – suegene 2012-07-31 03:43:15