Imprimer la ligne uniquement si la chaîne n’existe pas dans une colonne spécifique en tenant compte de chaque groupe de chaînes dans une autre colonne par UNIX

Donc, j’ai le fichier tabulé suivant avec mille lignes:

NP_000007.1 ACADM 1457 rs1061337 not_match NP_000007.1 ACADM 2761 rs2229249 not_match NP_000007.1 ACADM 2761 rs2229249 not_match NP_000019.2 AGL 1094 rs1042090 1398 NP_000019.2 AGL 1094 rs1042090 1395 NP_000057.1 C8B 1078 rs1013579 117 NP_000057.1 C8B 932 rs856847 345 NP_000057.1 C8B 932 rs856831 not_match NP_000057.1 C8B 932 rs856841 429 NP_000076.2 CLCNKB 48 rs5251 334 

Je voudrais supprimer ces lignes pour chaque groupe de chaînes regroupées dans la première colonne si au moins apparaît un motif not_match une fois dans la cinquième colonne. Ainsi, seules les lignes regroupées par la même chaîne dans la première colonne, correspondant aux seuls chiffres de la cinquième colonne, sont imprimées.

La sortie souhaitée serait:

 NP_000019.2 AGL 1094 rs1042090 1398 NP_000019.2 AGL 1094 rs1042090 1395 NP_000076.2 CLCNKB 48 rs5251 334 

Je pense à le faire par étapes en séparant les lignes avec le modèle “not_match” et les nombres dans la cinquième colonne et ensuite voir s’il y a des coïncidences dans la première colonne par un hachage et rejeter ces coïncidences. Cependant, je voudrais faire en une seule étape dans le même fichier. Comment pourrais-je l’obtenir dans un environnement Unix? Merci d’avance

awk à la rescousse!

un algorithme à deux passes sera le plus simple

 $ awk 'NR==FNR { # in the first round if($NF=="not_match") a[$1]; # record the keys to be deleted next} # !($1 in a)' file{,} # in the second round skip them 

notez que le file{,} est un raccourci pour file file

 NP_000019.2 AGL 1094 rs1042090 1398 NP_000019.2 AGL 1094 rs1042090 1395 NP_000076.2 CLCNKB 48 rs5251 334 

Solution alternative + solution awk :

 sort -k1,1 -k5,5r file | awk '!($1 in a){ a[$1]=$5 }a[$1]!="not_match"' 

Le résultat:

 NP_000019.2 AGL 1094 rs1042090 1398 NP_000019.2 AGL 1094 rs1042090 1395 NP_000076.2 CLCNKB 48 rs5251 334