다음과 같은 파일이 있습니다.
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