如何为列表项生成唯一编号
How to generate unique numbers for list items
我在一个名为 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
我尝试生成一个随机数列表并保存到一个新的文本文件,然后 paste
或 join
将新的文本文件保存到 list.txt
:
paste -d list.txt random.txt
目前输出不保留唯一 ID,如果同名出现不止一次,它有不同的 ID。
你可以使用这个 awk:
awk '!seen[]{seen[] = rand() * 1000000} {print [=10=] " - " seen[]}' file
may-111 - 840188
may-111 - 840188
rob-222 - 394383
kim-456 - 783099
may-111 - 840188
rand()
是生成随机数的函数,如 0.840188
seen
是一个关联数组,键为</code>,值为随机数</li>
<li><code>!seen[]
- 对不在数组 seen
中的键执行此块
seen[] = rand() * 1000000
- 用 key=
和 value=rand()
填充数组
{print [=21=] " - " seen[]}
- 打印当前行并为数组中的键 </code> 存储随机值。</li>
</ul>
<hr>
<p><strong>编辑:</strong>(感谢 JID)可以使用这个 awk 命令来避免重复数字:</p>
<pre><code>awk '!seen[[=11=]]{do{x=int(rand()*1000);seen[[=11=]]=x}while(nums[x])}
{print [=11=], "-", seen[[=11=]]}' ile
may-111 - 840
may-111 - 840
rob-222 - 394
kim-456 - 783
may-111 - 840
您可以创建一个标识符,作为它第一次出现的行号:
$ awk '{if ( in a) {c=a[]} else {c=NR; a[]=c}} {print , c}' file
may-111 1
may-111 1
rob-222 3
kim-456 4
may-111 1
这样,您就不会得到任何重复的值。
更地道():
awk '{!a[[=11=]]&&a[[=11=]]=NR}{print [=11=],a[[=11=]]}' file
说明
这会将 id 存储在一个数组 a[]
中,这样每次我们读取一行时,我们都会交叉检查它是否已经具有定义的关联值。
{if (...) {action if true} else {action if false}
{if ( in a) {c=a[]} else {c=NR; a[]=c}}
从我们第一次读取该行时获取关联值。如果不是,则获取存储的值。
print , c
打印内容和标识符。
你当然可以调整它:
- 对于不同的输出分隔符,例如使用
-v OFS=" - "
。
- 对于更大的关联值,求和或相乘或任何常数。
我在一个名为 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
我尝试生成一个随机数列表并保存到一个新的文本文件,然后 paste
或 join
将新的文本文件保存到 list.txt
:
paste -d list.txt random.txt
目前输出不保留唯一 ID,如果同名出现不止一次,它有不同的 ID。
你可以使用这个 awk:
awk '!seen[]{seen[] = rand() * 1000000} {print [=10=] " - " seen[]}' file
may-111 - 840188
may-111 - 840188
rob-222 - 394383
kim-456 - 783099
may-111 - 840188
rand()
是生成随机数的函数,如0.840188
seen
是一个关联数组,键为</code>,值为随机数</li> <li><code>!seen[]
- 对不在数组seen
中的键执行此块
seen[] = rand() * 1000000
- 用key=
和value=rand()
填充数组
{print [=21=] " - " seen[]}
- 打印当前行并为数组中的键</code> 存储随机值。</li> </ul> <hr> <p><strong>编辑:</strong>(感谢 JID)可以使用这个 awk 命令来避免重复数字:</p> <pre><code>awk '!seen[[=11=]]{do{x=int(rand()*1000);seen[[=11=]]=x}while(nums[x])} {print [=11=], "-", seen[[=11=]]}' ile may-111 - 840 may-111 - 840 rob-222 - 394 kim-456 - 783 may-111 - 840
您可以创建一个标识符,作为它第一次出现的行号:
$ awk '{if ( in a) {c=a[]} else {c=NR; a[]=c}} {print , c}' file
may-111 1
may-111 1
rob-222 3
kim-456 4
may-111 1
这样,您就不会得到任何重复的值。
更地道(
awk '{!a[[=11=]]&&a[[=11=]]=NR}{print [=11=],a[[=11=]]}' file
说明
这会将 id 存储在一个数组 a[]
中,这样每次我们读取一行时,我们都会交叉检查它是否已经具有定义的关联值。
{if (...) {action if true} else {action if false}
{if ( in a) {c=a[]} else {c=NR; a[]=c}}
从我们第一次读取该行时获取关联值。如果不是,则获取存储的值。print , c
打印内容和标识符。
你当然可以调整它:
- 对于不同的输出分隔符,例如使用
-v OFS=" - "
。 - 对于更大的关联值,求和或相乘或任何常数。