ファイルに重複エントリを追加する

ファイルに重複エントリを追加する

次のファイルがあります。

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

関連情報