将字符串映射到唯一的数字?

Leg*_*end 3 c++ bash awk

是否有一个很好的bash one liner将文件中的字符串映射到唯一的数字?

例如,

a
a
b
b
c
c
Run Code Online (Sandbox Code Playgroud)

应该转换成

1
1
2
2
3
3
Run Code Online (Sandbox Code Playgroud)

我目前正在用C++实现它,但是bash one-liner会很棒.

Joh*_*ica 10

awk '{if (!($0 in ids)) ids[$0] = ++i; print ids[$0]}'
Run Code Online (Sandbox Code Playgroud)

这维护了一个名为的关联数组ids.每次找到一个新字符串时,它都会为其分配一个单调递增的id ++i.

例:

jkugelman$ echo $'a\nb\nc\na\nb\nc' | awk '{if (!($0 in ids)) ids[$0] = ++i; print ids[$0]}'
1
2
3
1
2
3
Run Code Online (Sandbox Code Playgroud)