用于将当前行与下一行进行比较并根据条件打印其中一行的 awk 解决方案
Posted
技术标签:
【中文标题】用于将当前行与下一行进行比较并根据条件打印其中一行的 awk 解决方案【英文标题】:awk solution for comparing current line to next line and printing one of the lines based on a condition 【发布时间】:2012-07-27 03:18:42 【问题描述】:我有一个如下所示的输入文件(第一列是位置编号,第二列是应随时间增加的计数):
1 0
1 2
1 6
1 7
1 7
1 8
1 7
1 7
1 9
1 9
1 10
1 10
1 9
1 10
1 10
1 10
1 10
1 10
1 10
1 9
1 10
1 10
1 10
1 10
1 10
1 10
我想修复它,看起来像这样(替换计数随着之前的计数而减少):
1 0
1 2
1 6
1 7
1 7
1 8
1 8
1 8
1 9
1 9
1 10
1 10
1 10
1 10
1 10
1 10
1 10
1 10
1 10
1 10
1 10
1 10
1 10
1 10
1 10
1 10
我一直在尝试为此使用 awk,但由于我似乎无法弄清楚如何重置行号(NR?)所以它会读取每一行并且它是下一行,因此我绊倒了 getline,一次不是两条线。这是我到目前为止的代码,有什么想法吗?
awk 'a=$1; b=$2; getline; c=$1; d=$2; if (a==c && b<=d) print a"\t"b; else print c"\t"d' original.txt > fixed.txt
另外,这是我目前得到的输出:
1 0
1 6
1 7
1 7
1 9
1 10
1 9
1 10
1 10
1 9
1 10
1 10
1 10
【问题讨论】:
好的,澄清一下,您是否要跳过计数减少的行?这么多行,不知道你能否举一个同样清楚的更简短的例子? 对不起,如果我的解释不清楚,我想在计数减少时打印前一行,所以最终得到相同的行数,但文件的计数保持不变或增加,但绝不会减少。 我明白了..看看下面提供的答案,我想你会找到你想要的。 【参考方案1】:也许你想要的只是:
awk '$2 < p $2 = p p = $2 1' input-file
如果第二列中的值为负数,这将在第一行失败,所以这样做:
awk 'NR > 1 && $2 < p ...'
如果当前值小于,这只是将第二列设置为前一个值,然后将当前值存储在变量 p 中,然后打印该行。
请注意,这也会稍微修改更改行上的输出间距。如果您的输入是制表符分隔的,您可能想要这样做:
awk 'NR > 1 && $2 < p $2 = p p = $2 1' OFS=\\t input-file
【讨论】:
哇.. 这么简洁.. 我想我有你的第一个解决方案的详细版本 太棒了,我只是想弄清楚间距,谢谢!【参考方案2】:这个脚本会做你喜欢的事情:
if ($2 < prev_count)
$2 = prev_count
else
prev_count = $2
printf("%d %d\n", $1, $2)
这是一个易于阅读的详细版本:)
【讨论】:
谢谢,我也很欣赏详细版本! @suegene 很高兴为您提供帮助.. 我用printf
调整了输出间距,如果您需要,它可以让您更好地控制格式/间距。以上是关于用于将当前行与下一行进行比较并根据条件打印其中一行的 awk 解决方案的主要内容,如果未能解决你的问题,请参考以下文章