【问题标题】:for loop in awk to compare subsequent rows within fileawk中的for循环比较文件中的后续行
【发布时间】:2012-07-31 03:21:48
【问题描述】:

我之前问过如何使用 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

【问题讨论】:

    标签: for-loop awk


    【解决方案1】:

    与其计算行数,不如让另一个变量跟踪行号,如果行号增加,它会重置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 只是表示“打印”;否则该命令将执行所有处理但不打印任何处理。

    【讨论】:

    • 效果很好!只需添加“OFS=\\t”即可重置为制表符分隔。特别感谢您的解释!
    猜你喜欢
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 2014-01-13
    相关资源
    最近更新 更多