使用 (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$2不在 array 中a,则添加它, value 是字符串user和前缀递增变量的串联++n

  • 将 的值替换$2为 array 中对应的值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添加了文件名后缀。

如果您想在字符串中使用零填充的数字user,您可以替换m[$2] = "user" ++n为 eg ,这将为您提供给定数据的m[$2] = sprintf("user%.3d", ++n)字符串user001到 to 。user014

相关内容