我有一个标签限制数据,显示为
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/