(G)AWK를 사용하여 이름을 ID로 바꿉니다.

(G)AWK를 사용하여 이름을 ID로 바꿉니다.

이름을 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가 $2array에 없으면 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새 문자열이 생성되어 에 저장됩니다.userm

Steeldriver가 결정한 것처럼 생성된 레코드를 입력 파일과 동일한 이름의 새 파일에 쓰고 .anon파일 이름 접미사를 추가했습니다.

문자열에 0으로 채워진 숫자를 사용하려면 를 로 user바꾸면 m[$2] = "user" ++n주어진 데이터가 포함된 m[$2] = sprintf("user%.3d", ++n)문자열이 제공됩니다 user001.user014

관련 정보