次のファイルがあります。
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