파일에 중복 항목 추가

파일에 중복 항목 추가

다음과 같은 파일이 있습니다.

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

관련 정보