이름을 ID 번호로 대체하여 여러 관련 파일을 익명화하고 싶습니다.
입력 예
파일 1:
2 simon
4 wesley
5 nikesh
8 sarah
1 jenny
파일 2:
3 casey
8 jenny
1 alan
1 jessie
5 gordon
9 bill
1 sue
파일 3
4 jack
2 jenny
6 wesley
8 sarah
6 gordon
1 derek
6 sue
1 jessie
2 pritesh
7 bill
원하는 출력
파일 1
2 user1
4 user2
5 user3
8 user4
1 user5
파일 2:
3 user6
8 user5
1 user7
1 user8
5 user9
9 user10
1 user11
파일 3
4 user12
2 user5
6 user2
8 user4
6 user9
1 user13
6 user11
1 user8
2 user14
7 user10
내가 시도한 것
솔루션에 배열이 포함되기를 바라지만 이 문제로 어려움을 겪고 있습니다.
답변1
당신은 다음과 같은 것을 할 수 있습니다
awk '!($2 in a){a[$2] = "user"(++n)} {$2 = a[$2]; print > (FILENAME".anon")}' file1 file2 file3
key가
$2
array에 없으면a
추가되고 value는user
문자열과 접두사 증가 변수의 연결 입니다.++n
값을
$2
배열의 해당 값으로 바꾼a
다음 현재 파일 이름과 접미사를 연결한 이름의 새 파일에 결과를 인쇄합니다.
답변2
본질적으로 다음스틸 드라이버의 답변, 단일 awk
코드 블록(실제로는 단일 print
명령문)으로 재구성됩니다.
awk '{ print $1, ($2 in m) ? m[$2] : m[$2] = "user" ++n >(FILENAME ".anon") }' file[123]
이 코드는 할당 결과가 할당되는 값이라는 사실을 활용합니다.
연관 배열에는 m
이름과 익명 문자열 간의 매핑이 포함됩니다 user
. 입력 파일에서 읽은 두 필드의 각 레코드에 대해 첫 번째 출력 필드는 있는 그대로 재현되고 두 번째 필드는 배열의 키로 사용되는 두 번째 입력 필드와 연결된 값에서 선택됩니다 m
. 에 해당 키가 없으면 m
새 문자열이 생성되어 에 저장됩니다.user
m
Steeldriver가 결정한 것처럼 생성된 레코드를 입력 파일과 동일한 이름의 새 파일에 쓰고 .anon
파일 이름 접미사를 추가했습니다.
문자열에 0으로 채워진 숫자를 사용하려면 를 로 user
바꾸면 m[$2] = "user" ++n
주어진 데이터가 포함된 m[$2] = sprintf("user%.3d", ++n)
문자열이 제공됩니다 user001
.user014