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

发布于 2024-09-25 03:05:38 字数 188 浏览 1 评论 0原文

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

例如,

a
a
b
b
c
c

应该转换为

1
1
2
2
3
3

我目前正在用 C++ 实现它,但 bash 单行代码会很棒。

Is there a nice bash one liner to map strings inside a file to a unique number?

For instance,

a
a
b
b
c
c

should be converted into

1
1
2
2
3
3

I am currently implementing it in C++ but a bash one-liner would be great.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

遮云壑 2024-10-02 03:05:38
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
awk '{if (!($0 in ids)) ids[$0] = ++i; print ids[$0]}'

This maintains an associative array called ids. Each time it finds a new string it assigns it a monotically increasing id ++i.

Example:

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
荆棘i 2024-10-02 03:05:38

这里的 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

The awk solutions here are fine, but here's the same approach in pure 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
埖埖迣鎅 2024-10-02 03:05:38
awk 'BEGIN { num = 0; }
{
    if ($0 in seen) {
        print seen[$0];
    } else {
        seen[$0] = ++num;
        print num;
    }
}' [file]

(当然,不完全是一行。)

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

(Not exactly one line, ofcourse.)

静水深流 2024-10-02 03:05:38

没有 if 的轻微修改

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

slight modification without the if

awk '!($0 in ids){ids[$0]=++i}{print ids[$0]}' file
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文