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
4 Réponses :
Pourriez-vous s'il vous plaît essayer de suivre, écrit et testé sur les échantillons affichés uniquement dans GNU Explication: Ajout d'une explication détaillée pour ci-dessus. 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.
awk
.awk '
FNR==NR{
a[$0]
next
}
match($0,/Gene[0-9]+/) && (substr($0,RSTART,RLENGTH) in a)
' names Input_file
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
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 :)
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?
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 .
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
.
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
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.