如何用数字替换复杂的ID?

4

我有一个文件,每个ID号码都有多个条目。该文件大约有2,000个ID,每个ID有54,000个观测值。我需要将输出输入到一个算法中,该算法要求ID小于6个字符。我该如何用数字1到2000替换ID?文件中的ID看起来像这样:

2007I804567
2007I804567
2007I804567
2007I804568
2007I804568
2007I804568
2007I804569
2007I804569
2007I804569

需要让它看起来像这样(想保留ID):
1 2007I804567
1 2007I804567
1 2007I804567
2 2007I804568
2 2007I804568
2 2007I804568
3 2007I804569
3 2007I804569
3 2007I804569

谢谢


你需要将每个唯一的ID映射到一个数字(小于1,000,000),然后将其提供给算法。最后一步是将你的数字转换回ID。 - Jonathan M
我考虑对ID进行唯一排序,然后分配行号。但是,如何将这些行号返回到大文件呢? - Justin Buchanan
你需要保留每个数字分配的ID,并在最后反转该过程。 - Jonathan M
2个回答

4
$ cat file
2007I804567
2007I804567
2007I804567
2007I804568
2007I804568
2007I804568
2007I804569
2007I804569
2007I804569
$ 
$ awk '!seen[$0]++{++id} {print id, $0}' file
1 2007I804567
1 2007I804567
1 2007I804567
2 2007I804568
2 2007I804568
2 2007I804568
3 2007I804569
3 2007I804569
3 2007I804569

太棒了,非常有效,谢谢。我有一个关于这个操作的问题。ID函数是否能够识别唯一的行并为该行分配一个ID?只有当我有一个仅包含ID的文件时,它才能正常工作,否则它只会输出到文件末尾的行号。 - Justin Buchanan
@jkshah - 不一定要排序,但是所有相同的数字都应该分组在一起,就像发布的代表性样本输入中所示。如果这不是OP想要的,那么创建一个映射数组就是一个微不足道的调整。 - Ed Morton
@EdMorton 同意。我也在想着数组映射的问题,并且同时解码您的代码。感谢您的澄清。 - jkshah
2
@JustinBuchanan 它保留了一个名为“seen”的数组,该数组以每行的内容为索引,并在输入文件中看到重复行时递增数组值,因此第一次出现一行时,“seen [line]”具有值零并且id变量被递增。我不理解您评论的最后一句话,但它几乎听起来像您发布的代表性输入文件实际上不是您真实输入文件的格式。显然,这将是一个问题 - 您需要发布一个真正代表性的输入文件才能有任何获得答案的机会。 - Ed Morton

2

尝试使用 awk

awk '!($0 in id) {id[$0]=++n} {print id[$0], $0}' file

简介

awk '
    !($0 in id) {             # if line is not present in array 'id'
         id[$0]=++n           # assign unique ID of a line to incremental number i.e. create an array of id with line a key 
    } 
    {
        print id[$0], $0      # print corresponding ID along with line content
    }' file                   # input file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接