perl - 查找列中的唯一值并将唯一值替换为数字

标签 perl unix replace awk

我有一个标签限制数据,显示为

1 0 0 1 1 Black Swan
0 0 1 0 0 Golden Duck
1 0 0 1 0 Brown Eagle
0 0 1 0 1 Golden Duck
1 0 0 1 0 Black Swan
1 0 1 0 0 Golden Duck
1 0 0 1 1 Sparrow

最后一列是由空格分隔的一个或多个单词的组合。我想计算最后一列中唯一值的数量,并将其替换为该组唯一的数字。我知道我可以计算并列出数字使用

awk -F '\t' '{print $NF}'  infile | sort | uniq | wc -l

但是如何用数字替换? 例如,将所有 Black Swan 替换为 1,将所有 Golden Duck 替换为 2 等。我希望结果是:

1 0 0 1 1 1
0 0 1 0 0 2
1 0 0 1 0 3
0 0 1 0 1 2
1 0 0 1 0 1
1 0 1 0 0 2
1 0 0 1 1 4

我还想生成赋予特定值的数字列表,例如

Black Swan 1
Golden Duck 2
Brown Eagle 3
Sparrow 4

最佳答案

您可以使用关联数组为每个不同的名称增加一个计数器:

awk '
    BEGIN { 
        FS = OFS = "\t" 
        i = 0
    }
    {
        if (! names[$NF]) {
            names[$NF] = ++i
        }
        $NF = names[$NF]
        print $0
    }
    END {
        for (name in names) {
            printf "%s %d\n", name, names[name]
        }
    }
' infile

它产生:

1       0       0       1       1       1
0       0       1       0       0       2
1       0       0       1       0       3
0       0       1       0       1       2
1       0       0       1       0       1
1       0       1       0       0       2
1       0       0       1       1       4
Golden Duck 2
Brown Eagle 3
Sparrow 4
Black Swan 1

关于perl - 查找列中的唯一值并将唯一值替换为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23566361/

相关文章:

linux - 有没有一种使用 bash 将作业提交到集群的好方法?

regex - 在 Eclipse 中取消注释 Perl 代码块的正则表达式是什么?

Java正则表达式匹配除一种特殊情况外的所有html元素

perl - 是否有理由在 Perl 中使用 open(...) 的双参数形式?

java - 坚持理解2个for循环

windows - Perl Net::SSH2 scp_put 放入文件然后挂起

linux - 使用 Perl 脚本跟踪并终止超时进程

linux - 我可以在主目录中安装 Mercurial 吗?

linux - 使用 screen 和设置压缩级别在 bash 中压缩文件

sql - 编写 SQL 查询来替换值并包含所有日期