我有一个这样的文件:
20001
17001
17001
53001
90001
90001
90001
我试图通过在重复条目时添加 1 来修改 $1,因此输出将如下所示:
20001
17001
17002
53001
90001
90002
90003
答案1
awk '{$1+=seen[$1]++} 1' file
在打印之前将后递增的哈希值添加到当前值 $1。
当值靠近时,上面的代码会产生重复的数字,例如序列 2,2,3 – 输出为 2,3,3。可以使用循环来实现 2,3,4:
awk '{while (c[$1]) {$1 += c[$1] += c[$1+c[$1]]} c[$1]++} 1'
数组c
存储 $1 要增加的偏移量(如seen
第一个示例)。它不是仅按该唯一值的偏移量增加 $1,而是按下一个值的偏移量增加,直到达到新的之前未见过的 $1。
答案2
一个变体@客人的回答只要之前已经输出过,就通过增加数字来防止输出重复:
awk '{while ($1 in c) $1 += c[$1]++; c[$1]++; print}' file
或与 中相同perl
,处理输入中任意位置的数字:
perl -pe 's{\d+}{
$i = $&;
while (defined($c{$i})) {$i += $c{$i}++}
$c{$i}++;
$i
}ge' file
在这样的输入上:
1
1
1
5
5
10
10
1
1
1
他们给:
1
2
3
5
6
10
11
4
7
8