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

时间:2010-09-29 16:45:17

标签: c++ bash awk

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

例如,

a
a
b
b
c
c

应转换为

1
1
2
2
3
3

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

4 个答案:

答案 0 :(得分:10)

awk '{if (!($0 in ids)) ids[$0] = ++i; print ids[$0]}'

这维护了一个名为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

答案 1 :(得分:3)

这里的awk解决方案很好,但是纯粹的bash(> = 4)中的方法相同

declare -A stringmap
counter=0
while read string < INPUTFILE; do
    if [[ -z ${stringmap[$string]} ]]; then
        let counter+=1
        stringmap[$string]=$counter
    fi
done
for string in "${!stringmap[@]}"; do
    printf "%d -> %s\n" "${stringmap[$string]}" "$string"
done

答案 2 :(得分:2)

awk 'BEGIN { num = 0; }
{
    if ($0 in seen) {
        print seen[$0];
    } else {
        seen[$0] = ++num;
        print num;
    }
}' [file]

(当然不是一行。)

答案 3 :(得分:2)

没有if

的轻微修改
awk '!($0 in ids){ids[$0]=++i}{print ids[$0]}' file