linux - 如何通过将 ids 列表与 LINUX 中的另一个数据文件进行比较来给予 ids 列表相同的排名?

标签 linux list shell awk rank

我有 id 列表(第 2 列),我根据它们的值(第 3 列)对这些 id 进行了从 1 到 600 的排名。我有另一个相同 id 的列表,但具有不同的排名,因为它们的值不同。如何将 file2 中的第一秒 id 列表与 file1 中的第一个 id 列表进行比较?例如:

file1:
     rank list-of-ids values
     1  HOUSAM69708729  0.4468
     2  HOCANM106363549 0.4434
     3  HOCANM10845509  0.4268
     4  HOCANM11098662 0.4203
     5  HOUSAM68571374 0.3896
     6  HOUSAM69990251 0.3895
     7  HONLDM716072164 0.3893
     8  HOUSAM69756113  0.3656
     9  HOCANM11098658  0.3593
    10  HOUSAM66626020 0.3538

file2:
list-of-ids values
HOCANM106363549  0.4832
HOUSAM69708729  0.4199
HOCANM10845509  0.4143
HOUSAM69990251  0.3887
HOCANM11098662  0.3792
HOUSAM69756113  0.365
HOUSAM68571374  0.3649
HONLDM716072164 0.3600
HOUSAM66626020  0.3593
HOCANM11098658  0.3545

输出文件应该是 file2,其排名来自 file1:

output:
 rank list-of-ids values
 2 HOCANM106363549  0.4832
 1 HOUSAM69708729  0.4199
 3 HOCANM10845509  0.4143
 6 HOUSAM69990251  0.3887
 4 HOCANM11098662  0.3792
 8 HOUSAM69756113  0.365
 5 HOUSAM68571374  0.3649
 7 HONLDM716072164 0.3600
10 HOUSAM66626020  0.3593
 9 HOCANM11098658  0.3545

请问有什么建议吗?请注意,实际数据没有任何 header ,因此输出也不应该有 header 。

最佳答案

另一种选择,使用'join'

$ join -1 2 -2 1 -o 1.1,2.1,2.2 <(sort -k 2 file1) <(sort -k 1 file2)
2 HOCANM106363549 0.4832
3 HOCANM10845509 0.4143
9 HOCANM11098658 0.3545
4 HOCANM11098662 0.3792
7 HONLDM716072164 0.3600
10 HOUSAM66626020 0.3593
5 HOUSAM68571374 0.3649
1 HOUSAM69708729 0.4199
8 HOUSAM69756113 0.365                                                                         
6 HOUSAM69990251 0.3887                                                                        
ranks list-of-ids values  

诚然,这并不能非常干净地处理 header 。您已经接受了一个解决方案,但我喜欢这个实用程序,但没有多少人知道它;)


编辑:如果源数据没有任何标题,那么此命令效果很好:

$ cat file1
     1  HOUSAM69708729  0.4468
     2  HOCANM106363549 0.4434                                                                 
     3  HOCANM10845509  0.4268                                                                 
     4  HOCANM11098662 0.4203                                                                  
     5  HOUSAM68571374 0.3896
     6  HOUSAM69990251 0.3895
     7  HONLDM716072164 0.3893
     8  HOUSAM69756113  0.3656
     9  HOCANM11098658  0.3593
    10  HOUSAM66626020 0.3538
$ cat file2
HOCANM106363549  0.4832
HOUSAM69708729  0.4199
HOCANM10845509  0.4143
HOUSAM69990251  0.3887
HOCANM11098662  0.3792
HOUSAM69756113  0.365
HOUSAM68571374  0.3649
HONLDM716072164 0.3600
HOUSAM66626020  0.3593
HOCANM11098658  0.3545
$ join -1 2 -2 1 -o 1.1,2.1,2.2 <(sort -k 2 file1) <(sort -k 1 file2)
2 HOCANM106363549 0.4832
3 HOCANM10845509 0.4143
9 HOCANM11098658 0.3545
4 HOCANM11098662 0.3792
7 HONLDM716072164 0.3600
10 HOUSAM66626020 0.3593
5 HOUSAM68571374 0.3649
1 HOUSAM69708729 0.4199
8 HOUSAM69756113 0.365
6 HOUSAM69990251 0.3887

如果您的任何一个文件确实包含 header ,那么您只需在“排序”之前将其 grep 出来即可:

$ cat file1
ranks list-of-ids values
     1  HOUSAM69708729  0.4468
     2  HOCANM106363549 0.4434
     3  HOCANM10845509  0.4268
     4  HOCANM11098662 0.4203
     5  HOUSAM68571374 0.3896
     6  HOUSAM69990251 0.3895
     7  HONLDM716072164 0.3893
     8  HOUSAM69756113  0.3656
     9  HOCANM11098658  0.3593
    10  HOUSAM66626020 0.3538
$ cat file2
list-of-ids values
HOCANM106363549  0.4832
HOUSAM69708729  0.4199
HOCANM10845509  0.4143
HOUSAM69990251  0.3887
HOCANM11098662  0.3792
HOUSAM69756113  0.365
HOUSAM68571374  0.3649
HONLDM716072164 0.3600
HOUSAM66626020  0.3593
HOCANM11098658  0.3545
$ join -1 2 -2 1 -o 1.1,2.1,2.2 <(grep -v "list-of-ids" file1 | sort -k 2) <(grep -v "list-of-ids" file2 | sort -k 1)
2 HOCANM106363549 0.4832
3 HOCANM10845509 0.4143
9 HOCANM11098658 0.3545
4 HOCANM11098662 0.3792
7 HONLDM716072164 0.3600
10 HOUSAM66626020 0.3593
5 HOUSAM68571374 0.3649
1 HOUSAM69708729 0.4199
8 HOUSAM69756113 0.365
6 HOUSAM69990251 0.3887

关于linux - 如何通过将 ids 列表与 LINUX 中的另一个数据文件进行比较来给予 ids 列表相同的排名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45986169/

相关文章:

linux - Ubuntu 上 CosmosDB 的 CRT 证书不起作用

sql - 连接 R 列表中的键值对

c:找到两个简单列表之间的连接(公共(public)节点)

python - 传递列表和字符串时不需要的输出格式

linux - 如何获取特定目录的完整路径?

c - 系统/类型.h : No such file or directory

c++ -/usr/bin/C++ 无法使用共享库编译为 gcc

linux - 本地linux机器(NAT后面)到aws实例(linux)之间的隧道

bash - 对标准输出的每一行添加时间戳

linux - 计算终端中打开的标签页数