1
votes

imprimer des lignes qui correspondent au modèle exact en utilisant awk

J'ai un fichier avec des noms, et je veux les rechercher dans un énorme fichier délimité par des tabulations et obtenir les lignes correspondantes. Je dois faire correspondre les noms exacts. J'ai donc essayé cette option grep, où je recherche un gros fichier en utilisant un fichier de noms (-f), et je spécifie que je veux correspondances exactes (-w).

7001253F:563:CC1HJANXX:8:2210:1232:2187#CTGAAGCTCAGGACGT    GN2a__NODE_1000349_length_1013_cov_0.309117_1      
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT    GN4a__NODE_1000349_length_1013_cov_0.303417_1  
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT    GN3a__NODE_1000343_length_1013_cov_0.309417_2
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT    GN2a__NODE_1020349_length_1013_cov_0.109437_1
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT    GN2a__NODE_1020349_length_1013_cov_0.109437_10
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT    GO4a__NODE_9_length_201043_cov_2.340371_8
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT    GO4a__NODE_9_length_201043_cov_2.340371_83
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT    GO4a__NODE_9_length_201043_cov_2.340371_87


2 commentaires

Bienvenue à SO, bravo pour avoir montré vos efforts sous forme de code, continuez comme ça. Pourriez-vous s'il vous plaît publier un petit ensemble de données d'échantillons d'entrées et de sorties attendues dans votre question afin que nous puissions mieux comprendre, veuillez modifier votre question et nous le faire savoir.


De plus, en voyant votre tentative, il semble que vous avez affaire à 2 Input_file (s), alors veuillez publier un petit extrait d'échantillons des deux avec la sortie d'échantillon attendue également dans votre question.


4 Réponses :


2
votes

Étant donné que les échantillons d'OP ont été complètement modifiés, ajoutez cette solution maintenant, encore une fois en fonction des échantillons affichés uniquement.

awk '                                   ##Starting awk program from here.
FNR==NR{                                ##Checking condition FNR==NR which will be TRUE when first Input_file is being read.
  a[$0]                                 ##Creating array a with index of current line here.
  next                                  ##next will skip all further statement from here.
}
match($0,/Gene[0-9]+/) && (substr($0,RSTART,RLENGTH) in a)    ##Matching regex of Gene digits(which are coing together) AND making sure this substring(which is actually matched value by regex) is present in names file array then print current line.
' names  Input_file                     ##Mentioning Input_file names here.

Pourriez-vous s'il vous plaît essayer de suivre, écrit et testé sur les échantillons affichés uniquement dans GNU awk.

awk '
FNR==NR{
  a[$0]
  next
}
match($0,/Gene[0-9]+/) && (substr($0,RSTART,RLENGTH) in a)
' names Input_file

Explication: Ajout d'une explication détaillée pour ci-dessus.

awk '
FNR==NR{
  a[$0]
  next
}
match($0,/[[:alnum:]]+__NODE_[0-9]+_length.*cov_[0-9]+\.[0-9]+_[0-9]+/) && (substr($0,RSTART,RLENGTH) in a)
' names Input_file


6 commentaires

Merci pour l'explication! Cela fonctionnerait probablement, mais mon fichier 'names' est plus complexe que juste "Gene". J'ai réalisé que j'aurais probablement dû le mentionner avant. J'ai édité le message.


@joanaseneca, c'est complètement changé maintenant :) lemme éditez la solution maintenant dans quelques minutes et revenez :)


@joanaseneca, pourriez-vous s'il vous plaît vérifier la solution EDIT et laissez-moi savoir comment ça se passe s'il vous plaît?


bien!! cela marche!! : D je vais maintenant haut de gamme! Merci beaucoup!


@joanaseneca, vous pouvez consulter ce lien meta.stackexchange.com/a/5235/380336 une fois trop bravo et heureux apprendre sur ce grand forum :)


@joanaseneca, heureux que cela vous ait aidé, vous pourriez aussi accepter cette réponse, bravo :)



2
votes

Je ne vois rien de mal avec votre one-liner bien qu'il puisse être simplifié à ceci pour un léger gain de performances

awk 'NR==FNR{a[$0]} NR>FNR && $2 in a' names bigfile >outputfile

ou un peu plus compact

awk 'NR==FNR{a[$0]} NR>FNR{if($2 in a)print $0}' names bigfile >outputfile

Je suppose qu'il y a des caractères de contrôle invisibles dans votre fichier de noms qui rejettent la sortie

Je suis également surpris que vous ayez trouvé grep plus lent que awk. Mes tests avec vos données dupliquées sur 3 millions de lignes montrent que grep est 3 fois plus rapide que awk

Est-ce que vous exécutez ceci sous Linux? S'agit-il de grep et awk GNU?


3 commentaires

salut, merci pour votre réponse! Oui, pour vos deux questions :) J'ai réalisé que cela ne faisait que ralentir lorsque j'ai ajouté l'option -w sur grep. Il y a eu beaucoup d'essais et d'erreurs. J'ai en fait créé cet ensemble de données factice basé sur l'erreur que j'ai identifiée auparavant. J'ai exécuté le code et cela fonctionne pour cet ensemble de données factice, donc je suis gêné d'avoir même posé la question avec l'utilisation de ces données. Je voulais surtout juste demander un équivalent awk -w, tel qu'il existe pour grep


ok - cela ne devrait pas arriver avec la correspondance de base - grep devrait être beaucoup plus rapide que awk


NR == FNR {a [$ 0]} NR> FNR {if ($ 2 in a) print $ 0} est plus couramment / idiomatiquement écrit comme NR == FNR {a [$ 0]; suivant} 2 $ dans un , voir stackoverflow.com/a/62521989/1745001 .



2
votes

votre explication n'est pas très claire. Il semble que vous essayez une correspondance littérale exacte, pas une expression régulière.

$ awk -F'\t' 'NR==FNR{a[$1]; next} $2 in a' names bigfile > outputfile

devrait fonctionner même si vous avez des espaces dans le premier champ. Cependant, je m'attends à ce qu'une correspondance grep littérale soit plus rapide que cela.

Notez que c'est presque la même chose que l'autre script awk .


0 commentaires

1
votes

Voici le travail que join doit faire:

$ join -t$'\t' -1 1 -2 2 -o '2.1 2.2' <(sort names) <(sort -k2,2 bigfile)
7001253F:563:CC1HJANXX:8:2210:1232:2187#CTGAAGCTCAGGACGT    GN2a__NODE_1000349_length_1013_cov_0.309117_1
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT    GN2a__NODE_1020349_length_1013_cov_0.109437_1
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT    GN2a__NODE_1020349_length_1013_cov_0.109437_10
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT    GN3a__NODE_1000343_length_1013_cov_0.309417_2
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT    GN4a__NODE_1000349_length_1013_cov_0.303417_1
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT    GO4a__NODE_9_length_201043_cov_2.340371_8
7001253F:563:CC1HJANXX:8:2210:1968:2031#CTGAAGCTCAGGACGT    GO4a__NODE_9_length_201043_cov_2.340371_83


0 commentaires