J'ai une très longue série d'URL sans caractère de séparation, dans le même format que ci-dessous:
http://example.comhttp://example.nethttp://example.orghttp://etc...
Je veux que chaque URL soit sur une nouvelle ligne. J'ai essayé de le faire en remplaçant toutes les instances de "http: //" par "\ nhttp: //" en utilisant sed
sed 's_http://_\nhttp://_g' urls.txt
mais un défaut de segmentation se produit (violation de mémoire). Je ne peux que supposer que la taille du fichier (c'est plus de 100 Go) fait que sed dépasse une certaine limite.
Je pourrais diviser le fichier en plusieurs fichiers plus petits pour le traitement, mais toutes les instances de "http: //" devraient être conservées intactes.
Y a-t-il une meilleure manière de faire cela?
text-processing
sed
C Sawyer
la source
la source
Réponses:
Avec,
awk
vous pouvez éviter de lire une énorme quantité de texte à la fois:Le succès peut dépendre de l'
awk
implémentation utilisée . Par exemplegawk
fonctionne bien, mais semawk
bloque.la source
Cela fera le travail:
En définissant $ / , j'ai changé la définition d'une ligne pour qu'elle se termine par
//
au lieu d'une nouvelle ligne. Cela fait que Perl lit une URL à la fois. Il est peu probable qu'une URL contienne,//
sauf après le schéma, mais c'est correct si c'est le cas, l'expression régulière l'empêchera d'ajouter de nouvelles lignes parasites.Si vous souhaitez éviter d'ajouter une ligne vide avant la première URL:
Vous pourriez essayer de comparer si
s!http://\z!\nhttp://!
c'est plus rapide. Ils sont équivalents. Notez que le/g
drapeau n'est pas nécessaire sur la substitution, car il ne peut y avoir un match par « ligne ».la source
$/
, il ne traitera qu'une seule URL à la fois.man perlvar
, mais c'est logique de cette façon.http:
partie dans l'expression régulière. Il examinera chaque élément//
, mais il n'ajoutera pas de nouvelle ligne à moins qu'il ne le trouvehttp://
.:
avec une nouvelle ligne, pour couper le fichier.http
à la fin de la ligne avechttp:
et y ajouter la ligne suivanteCes étapes ressemblent à:
Vérifiez s'il y a des lignes qui ne commencent pas par
http://
, imprimez les numéros de ligne. Cela ne se produirait que si a: se trouve quelque part dans l'URL autre qu'après lehttp
.grep -nv '^http://'
la source