Uma opção em Python baseada em texto simples, definitivamente mais detalhada:
#!/usr/bin/env python3
import sys
f = sys.argv[1]; out = sys.argv[2]
with open(out, "wt") as wr:
with open(f) as read:
for l in read:
for s in l.strip().split(","):
if any(["@" in s, "www" in s, "http" in s]):
wr.write(s+"\n")
Ou, apenas por diversão, um pouco mais comprimido:
#!/usr/bin/env python3
import sys
with open(sys.argv[2], "wt") as wr:
with open(sys.argv[1]) as read:
[[wr.write(s+"\n") for s in l.strip().split(",") if any(["@" in s, "www" in s, "http" in s])] for l in read]
Para usar
- Copie o script em um arquivo vazio, salve-o como
get_stuff.py
-
Execute-o com o arquivo de origem e o arquivo de saída de destino como argumentos:
python3 /path/to/get_stuff.py <input_file> <output_file>
Resultado:
[email protected]
http://www.example.com
[email protected]
http://www.example.com
[email protected]
[email protected]
www.example.com
[email protected]
Comparação no tempo
É interessante notar que em arquivos menores (como no exemplo), a opção sed
é mais rápida, mas em arquivos maiores a opção python é mais rápida:
em um arquivo de 150.000 linhas:
sed
real 0m0.073s
user 0m0.068s
sys 0m0.000s
python
real 0m0.046s
user 0m0.044s
sys 0m0.000s
Em um arquivo de 10 linhas:
sed
real 0m0.003s
user 0m0.000s
sys 0m0.000s
python
real 0m0.037s
user 0m0.032s
sys 0m0.000s
(Eu deveria mencionar que tenho uma caixa antiga, todos os tempos devem ser mais curtos em uma máquina séria)
A ideia pode ser que especialmente se você precisar extrair dados de muitos arquivos menores em um loop, use sed, em arquivos maiores em um loop, use python.
Em um único arquivo, pequeno ou grande, a diferença entre 0.073
e 0.046
é totalmente irrelevante.
Além disso
Abaixo de uma versão para extrair os mesmos dados de um diretório inteiro (simples) de arquivos.
#!/usr/bin/env python3
import sys
import os
dr = sys.argv[1]
def extract(f, out):
with open(out, "wt") as wr:
with open(f) as read:
[[wr.write(s+"\n") for s in l.strip().split(",") if any(
["@" in s, "www" in s, "http" in s]
)] for l in read]
for file in os.listdir(dr):
f = os.path.join(dr, file); out = os.path.join(dr, "extracted_"+file)
extract(f, out)
De cada um dos arquivos, o script criará um novo arquivo com os dados extraídos. De um arquivo:
somefile.csv
ele criará um segundo arquivo, chamado:
extracted_somefile.csv