我有一个看起来像这样的输入文件(第一列是位置编号,第二列是应该随时间增加的计数):
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
答案 0 :(得分:8)
也许你想要的只是:
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
答案 1 :(得分:2)
此脚本可以执行您喜欢的操作:
{
if ($2 < prev_count)
$2 = prev_count
else
prev_count = $2
printf("%d %d\n", $1, $2)
}
这是一个易于阅读的详细版本:)