2013-01-20 3 views
0

J'ai un ensemble de chaînes. Disons que, (list.txt) ils sont:restreindre le motif aux chaînes spécifiées

1abc_A 
2pqr_X 
4ghi_Z 

J'ai également un fichier texte (test.txt), qui ressemble à ceci:

1abc_A 2pqr_X 0.55  0.87 
2pqr_X 3def_Y 0.21  0.24 
4ghi_Z 1abc_A 0.98  0.75 
2pqr_X 4ghi_Z 0.99  0.76 
2pqr_X 2pqr_X 1.00  1.00 

Je dois obtenir que les lignes de test.txt, tels que les chaînes dans les colonnes 1 et 2, font partie des chaînes incluses dans list.txt

dans ce cas, ma sortie serait comme suit:

1abc_A 2pqr_X 0.55  0.87 
4ghi_Z 1abc_A 0.98  0.75 
2pqr_X 4ghi_Z 0.99  0.76 
2pqr_X 2pqr_X 1.00  1.00 

i.e toutes les lignes dans test.txt SAUF la 2ème ligne, puisque la colonne 2 dans la 2ème ligne, 3def_Y ne fait pas partie de la liste des chaînes spécifiées dans list.txt

Comment puis-je faire cela dans awk? Veuillez noter que test.txt est un gros fichier texte, de presque 7Go.

Quel est le moyen le plus rapide de résoudre ce problème? S'il vous plaît aider.

Répondre

3
awk 'NR==FNR{a[$0];next} ($1 in a) && ($2 in a)' list.txt test.txt 

stocke le contenu de list.txt comme indices d'un tableau, puis ligne par ligne des contrôles de TEST.TXT que c'est 1er et 2e champs sont les deux indices de ce tableau. Fonctionne pour n'importe quelle taille de test.txt car il ne stocke pas de test.txt en mémoire.

+0

merci Éd. c'est ce qu'il a fait. – ana

+0

+1 belle doublure – Kent

Questions connexes