2017-08-31 5 views
2

J'ai la liste des identifiants (colonne 2) que j'ai classés de 1 à 600 en fonction de leurs valeurs (colonne 3). J'ai une autre liste des mêmes identifiants mais avec un rang différent parce que leur valeur est différente. Comment puis-je comparer le rang/ordre de la première liste d'identifiants de fichier2 avec la première liste d'identifiants de fichier1? par exemple:Comment donner le même rang à une liste d'identifiants en les comparant à un autre fichier de données dans LINUX?

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 

le fichier de sortie doit être FICHIER2 avec rang venant de fichier1: toute suggestion, s'il vous plaît

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 

? Notez que les données réelles n'ont pas d'en-tête et que, par conséquent, la sortie ne doit pas contenir d'en-tête.

+0

que voulez-vous dire « que les données réelles ne pas l'en-tête », pouvez-vous s'il vous plaît poster ce que votre da réel ta ressemble à dans l'exemple? –

Répondre

2

awk solution:

awk 'NR==FNR{ a[$2]=$1; next }{ print a[$1],$1,$2 }' file1 file2 
  • NR==FNR - le traitement du fichier d'entrée 1er (ie file1)

  • a[$2]=$1 - capture rank valeurs (le premier champ $1) en un tableau, a indexé aveccorrespondantvaleurs (2ème champ $2)

  • next - saut à l'enregistrement suivant (file1)

  • print a[$1],$1,$2 - champs d'impression ($1, $2) à partir du fichier d'entrée 2 file2 avec correspondante rank valeur a[$1]


La sortie:

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 
+0

Mes données réelles n'ont pas de nom de colonne. comment peut-on supprimer "rank" comme nom de colonne? mon moyen est que je ne devrais pas avoir la première rangée (rang des valeurs de liste d'ids) dans la sortie – zara

+0

@ zara, voir ma mise à jour – RomanPerekhrest

+0

merci. peux-tu expliquer ton script?Je veux le comprendre – zara

3

Une autre alternative, utiliser '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 

Certes, cela ne gère pas l'en-tête très proprement. Vous avez déjà accepté une solution, mais j'aime cet utilitaire et pas beaucoup de gens sont au courant;)


Edit: Si les données source n'a pas de têtes, cette commande fonctionne très bien:

$ 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 

Si l'un de vos fichiers ne contiennent en-têtes, vous pouvez simplement les grep avant que le « genre »:

$ 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