Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了awk解决方案,用于将当前行与下一行进行比较,并根据条件打印其中一行大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我有一个看起来像这样的输入文件(第一列是位置编号,第二列是应该随时间增加的计数): 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
我有一个看起来像这样的输入文件(第一列是位置编号,第二列是应该随时间增加的计数):
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?)所以它会读取每一行并且它是下一行,而不是两行一次.这是我到目前为止的代码,有什么想法吗?

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

解决方法

也许你想要的只是:
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

大佬总结

以上是大佬教程为你收集整理的awk解决方案,用于将当前行与下一行进行比较,并根据条件打印其中一行全部内容,希望文章能够帮你解决awk解决方案,用于将当前行与下一行进行比较,并根据条件打印其中一行所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。