0
votes

Attraper tous les matchs entre deux colonnes

J'ai deux fichiers que je veux comparer leur 1ère colonnes code> et ajouter la colonne 2nd code> de file2.txt code> à la fin de File1.txt Code> Seulement s'il y a une correspondance: xxx pré>

J'essaie avec le code ci-dessous - que je m'attends à ce que cela fonctionne -: P>

NC_000008.10    1264       5646      G_synym=E4566  chr8
NC_000008.10    1264       5646      G=AGO2  chr8
NC_000008.10    5584       5646      G=AGO2  chr8
NC_000008.10    5218       5410      G=AGO2  chr8
NC_000008.10    2911       3031      G=AGO2  chr8
NC_000008.10    2552       2733      G=AGO2  chr8
NC_000008.10    0473       0609      G=AGO2  chr8
NC_000008.10    9494       9628      G=AGO2  chr8
NC_000008.10    8584       8671      G=AGO2  chr8
NC_000008.10    7188       7335      G=AGO2  chr8


1 commentaires

Comment ajouter une colonne à un fichier se rapportant à votre sujet de saisir tous les matchs entre deux colonnes ? Quelles sont les 2 colonnes?


3 Réponses :


2
votes

Le code que vous devriez utiliser dans awk code> aurait dû être

awk 'FNR == NR { hash[$1] = $2; next } $1 in hash { NF++; $NF = hash[$1] }1' file2 file1


0 commentaires

1
votes

Essayez ceci s'il vous plaît: xxx

Vous devez d'abord lire File2, puis File1.

Cependant, un peu ambigu dans votre question cependant, vous n'avez pas dit si ne correspond pas aux lignes doit imprimer ou non.
Si vous ne voulez pas que ces lignes ne correspondent pas, alors: xxx

Une autre chose est, les champs de sortie sont séparés par un seul espace. Étant donné que vos fichiers d'entrée semblent bien au format, vous pouvez donc souhaiter -v ofs = "\ t" pour séparer la sortie avec onglet .

Remarque Si File2 pourrait être vide, vous devez modifier nr == fnr sur des méthodes de vérification des fichiers différents, comme argind == 1 pour GNU awk, ou fichier nom == "fichier2.txt" ou nom_fr == argv [1] etc.

nr == fnr Check Fichier, cela signifie fondamentalement le premier fichier de lecture ( file2.txt ici).
A est le tableau pour stocker 2nd ligne de fichier1.txt, en utilisant sa 1ère ligne comme clé.
1 $ dans A Voir si $ 1 existe dans le tableau A comme clé, s'il existe des moyens correspondants. (Vous pouvez passer à A [$ 1] si vous souhaitez vérifier la valeur à la place. Lorsque vous êtes sûr que la valeur ne sera pas vide, vous pouvez les utiliser de manière interchangeable.)
++ NF Augmentez le numéro de champ par 1. $ NF représente la dernière colonne. Alors,
$ (++ nf) représente la colonne après File2.txt La dernière colonne.
Dernier 1 est juste un simple vrai là, pour impliquer un {impression} bloc.


2 commentaires

Oui, désolé j'ai édité ma question comme je ne veux que les correspondances. Pour votre code, cela fonctionne! Pouvez-vous expliquer un peu si possible?


@bapors mis à jour. Je vous suggère également de lire DOC et Man Awk < / code>.



2
votes

Si les fichiers sont triés dans la touche, le plus simple est

$ join -a1 file1 file2 | column -t

NC_000008.10  1264  5646  G_synym=E4566  chr8
NC_000008.10  1264  5646  G=AGO2         chr8
NC_000008.10  5584  5646  G=AGO2         chr8
NC_000008.10  5218  5410  G=AGO2         chr8
NC_000008.10  2911  3031  G=AGO2         chr8
NC_000008.10  2552  2733  G=AGO2         chr8
NC_000008.10  0473  0609  G=AGO2         chr8
NC_000008.10  9494  9628  G=AGO2         chr8
NC_000008.10  8584  8671  G=AGO2         chr8
NC_000008.10  7188  7335  G=AGO2         chr8


0 commentaires