bash - 如何为列表项生成唯一编号

标签 bash shell awk sed

我在名为 list.txt 的文件中有一长串值,我想为文件文本文件中的每个项目生成一个随机的唯一编号。如果该项目出现不止一次,它将具有相同的唯一 ID

例如 list.txt 将是:

may-111
may-111
rob-222
kim-456
may-111

我希望能够为每个项目分配一个随机数。如果该项目出现不止一次,那么它将具有相同的唯一 ID 号,因此预期的输出应该是:-

may-111 - 789
may-111 - 789
rob-222 - 365
kim-456 - 641
may-111 - 789

我已经尝试生成一个随机数列表并保存到一个新的文本文件,然后将新文本文件粘贴加入list.txt :

paste -d list.txt random.txt

目前,输出不保留唯一 ID,如果同名出现多次,则它具有不同的 ID。

最佳答案

你可以使用这个 awk:

awk '!seen[$1]{seen[$1] = rand() * 1000000} {print $0 " - " seen[$1]}' file
may-111 - 840188
may-111 - 840188
rob-222 - 394383
kim-456 - 783099
may-111 - 840188
  • rand() 是生成随机数的函数,如 0.840188
  • seen 是一个关联数组,键为$1,值为随机数
  • !seen[$1] - 对不在数组 seen 中的键执行此 block
  • seen[$1] = rand() * 1000000 - 使用 key=$1value=rand() 填充数组
  • {print $0 "- "seen[$1]} - 打印当前行并为数组中的键 $1 存储随机值。

编辑:(感谢 JID)可以使用这个 awk 命令来避免重复数字:

awk '!seen[$0]{do{x=int(rand()*1000);seen[$0]=x}while(nums[x])} 
     {print $0, "-", seen[$0]}' ile
may-111 - 840
may-111 - 840
rob-222 - 394
kim-456 - 783
may-111 - 840

关于bash - 如何为列表项生成唯一编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27986734/

相关文章:

bash - 使用 zcat 和 sed 或 awk 编辑压缩的 .gz 文本文件

Bash:当前目录中匹配正则表达式的文件的总大小

git - 是否可以通过命令行删除 Github 上的远程存储库?

bash - Shell,将所有输出重定向到文件但仍打印回显

linux - 在 bash 中提取特定单词

shell - UNIX - 格式化另一个 shell 脚本 - 在 sed 中使用 awk

bash - 在 macOS 终端上重命名多个文件

bash - 从 bash 中的行中提取两个子字符串,然后将它们连接起来

linux - 如何将 tail -1 输入到 sh 脚本 var

regex - awk 模式匹配语法 c&&!--c