awk解决方案,用于将当前行与下一行进行比较,并根据条件打印其中
发布时间:2020-12-13 17:00:00 所属栏目:Linux 来源:网络整理
导读:我有一个看起来像这样的输入文件(第一列是位置编号,第二列是应该随时间增加的计数): 1 01 21 61 71 71 81 71 71 91 91 101 101 91 101 101 101 101 101 101 91 101 101 101 101 101 10 并且我想修复它看起来像这样(替换计数随先前计数减少): 1 01 21 61 71
我有一个看起来像这样的输入文件(第一列是位置编号,第二列是应该随时间增加的计数):
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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |