Comment grep le contenu du fichier et créer un autre fichier avec un contenu goulu?

Je veux obtenir le contenu grep du fichier correspondant à un texte particulier et ensuite enregistrer tous les enregistrements correspondant à un texte particulier dans un nouveau fichier et je veux également m’assurer que le contenu correspondant est supprimé du fichier d’origine.

296949657|QL|163744584|163744581|20441|| 292465754|RE|W757|3012|301316469|00| 296950717|RC|7264|00001|013|27082856203| 292465754|QL|191427266|191427266|16405|| 296950717|RC|7264|AETNAACTIVE|HHRPPO|27082856203| 299850356|RC|7700|153447|0891185100102-A|W19007007201| 292465754|RE|W757|3029|301316469|00| 299850356|RC|7700|153447|0891185100104-A|W19007007201| 293695591|QL|743559415|743559410|18452|| 297348183|RC|6602|E924|0048|CD101699303| 297348183|RC|6602|E924|0051|CD101699303| 108327882|QL|613440276|613440275|17435|| 

J’ai écrit awk et cela fonctionne comme prévu pour les petits fichiers, mais pour les fichiers plus volumineux, cela ne fonctionne pas comme prévu … Je suis sûr que j’ai raté quelque chose …

 awk '{print $0 > ($0~/RC/?"RC_RECORDS":"TEST.DAT")}' TEST.DAT 

toute reflection sur la façon de résoudre ce problème.

Mise à jour 1

Maintenant, dans le fichier ci-dessus, je veux toujours vérifier les valeurs de la colonne deux à | RC | et s’il correspond, déplacez cet enregistrement dans le fichier RC_RECORDS et si les valeurs correspondent à | RE | puis déplacez-le vers RE_RECORDS, comment cela peut-il être fait.

Cas 1:

Donc, par exemple, si j’ai des enregistrements comme

 108327882|RE|613440276|613440275|RC|| 

alors il devrait aller au fichier RE_RECORDS.

Cas 2:

 108327882|RC|613440276|613440275|RE|| 

alors il devrait aller à RE_RECORDS

Cas 3:

 108327882|QL|613440276|613440275|RC|| 

alors il ne devrait pas aller à RE_RECORDS ou à RC_RECORDS

Cas 4:

 108327882|QL|613440276|613440275|RE|| 

alors il ne devrait pas aller à RE_RECORDS ou à RC_RECORDS

Mon intuition est que

 awk '/\|RC\|/ {print > "RC_RECORDS.DAT";next} {print > "NEWTEST.DAT"}' TEST.DAT | awk '$2 == "RC"' awk '/\|RE\|/ {print > "RE_RECORDS.DAT";next} {print > "FINAL_NEWTEST.DAT"}' NEWTEST.DAT | awk '$2 == "RE"' 

mais je voulais vérifier s’il existe une solution plus efficace et plus rapide.

Mise à jour 2

entrer la description de l'image ici

Mise à jour 3 entrer la description de l'image ici

Je pense que c’est ce que vous voulez:

Option 1

 awk -F'|' ' $2=="RC" {print >"RC_RECORDS.TXT";next} $2=="RE" {print >"RE_RECORDS.TXT";next} {print >"OTHER_RECORDS.TXT"}' file 

Vous pouvez mettre tout cela sur une seule ligne si vous préférez, comme ceci:

 awk -F'|' '$2=="RC"{print >"RC_RECORDS.TXT";next} $2=="RE"{print >"RE_RECORDS.TXT";next}{print >"OTHER_RECORDS.TXT"}' file 

Option 2

Ou vous pouvez voir à quel point grep compare à la vitesse / lisibilité:

 grep -E "^[[:alnum:]]+\|RC\|" file > RC_RECORDS.TXT & grep -E "^[[:alnum:]]+\|RE\|" file > RE_RECORDS.TXT & grep -vE "^[[:alnum:]]+\|R[CE]" file > OTHER_RECORDS.TXT & wait 

Option 3

Cette solution utilise 2 processus awk et permet peut-être un meilleur parallélisme dans les E / S. Le premier awk extrait les enregistrements RC dans un fichier et transmet le rest. Le second awk extrait les enregistrements RE dans un fichier et transmet le rest pour être écrit dans le fichier OTHER_RECORDS.TXT .

 awk -F'|' '$2=="RC"{print >"RC_RECORDS.TXT";next} 1' file | awk -F'|' '$2=="RE"{print >"RE_RECORDS.TXT";next} 1' > OTHER_RECORDS.TXT 

J’ai créé un fichier d’enregistrement de 88 Mo (3 Go) et j’ai effectué des tests sur un iMac de bureau comme suit:

 Option 1: 65 seconds Option 2: 92 seconds Option 3: 53 seconds 

Votre kilométrage peut varier.

Mon fichier ressemble à ceci, à savoir 33% d’enregistrements RE, 33% d’enregistrements RC et le rest:

 00000000|RE|abcdef|ghijkl|mnopq|rstu 00000001|RC|abcdef|ghijkl|mnopq|rstu 00000002|XX|abcdef|ghijkl|mnopq|rstu 00000003|RE|abcdef|ghijkl|mnopq|rstu 00000004|RC|abcdef|ghijkl|mnopq|rstu 00000005|XX|abcdef|ghijkl|mnopq|rstu 00000006|RE|abcdef|ghijkl|mnopq|rstu 00000007|RC|abcdef|ghijkl|mnopq|rstu 00000008|XX|abcdef|ghijkl|mnopq|rstu 00000009|RE|abcdef|ghijkl|mnopq|rstu 

Verification sanitaire

 wc -l *TXT 29333333 OTHER_RECORDS.TXT 29333333 RC_RECORDS.TXT 29333334 RE_RECORDS.TXT 88000000 total