O script abaixo deve fazer o trabalho. Como ele lê por linha, ele deve ser relativamente rápido em arquivos maiores, mas não foi testado em um arquivo grande.
#!/usr/bin/env python3
import sys
f = sys.argv[1]
s = ""
with open(f) as lines:
for l in lines:
if l.startswith("D"):
print(s+l.strip(), end = "")
s = "\n"
else:
print(l.strip(), end = "")
Use
Explicação
O script lê as linhas, linha por linha. Se a linha começa com um D
, senão a linha é simplesmente impressa após a linha existente, exceto para a primeira linha.
Teste:
D611102 = 'SVM_PRS_Hydr_L01', T = 0.0,C = 3.341441E-006 * Cp_SVM_PRS_Pi001 * Dens_SVM_PRS_Pi001,
A = 0.007425, ALP = 1.000000, EPS = 1.000000,
FX = -0.355305, FY = 0.857782, FZ = 0.282590;
D611102 = 'SVM_PRS_Hydr_L01', T = 0.0,C = 3.341441E-006 * Cp_SVM_PRS_Pi001 * Dens_SVM_PRS_Pi001,
A = 0.007425, ALP = 1.000000, EPS = 1.000000,
FX = -0.355305, FY = 0.857782, FZ = 0.282590;
torna-se:
D611102 = 'SVM_PRS_Hydr_L01', T = 0.0,C = 3.341441E-006 * Cp_SVM_PRS_Pi001 * Dens_SVM_PRS_Pi001,A = 0.007425, ALP = 1.000000, EPS = 1.000000,FX = -0.355305, FY = 0.857782, FZ = 0.282590;
D611102 = 'SVM_PRS_Hydr_L01', T = 0.0,C = 3.341441E-006 * Cp_SVM_PRS_Pi001 * Dens_SVM_PRS_Pi001,A = 0.007425, ALP = 1.000000, EPS = 1.000000,FX = -0.355305, FY = 0.857782, FZ = 0.282590;
EDITAR
ou
como sugerido por @terdon, usando o final ";" como um acionador, o que nos dá a oportunidade de ignorar o truque s =
:
#!/usr/bin/env python3
import sys
f = sys.argv[1]
with open(f) as lines:
for l in lines:
l = l if l.endswith(";\n") else l.strip(); print(l, end = "")
Comparando o Perl ao python
Em um arquivo relativamente grande, 550MB, 9006121 linhas:
Perl:
$ time perl -pe 's/(?<!;)\s*\n/ /' '/home/jacob/Bureaublad/data_large' > '/home/jacob/Bureaublad/data_large2'
real 0m27.171s
user 0m25.536s
sys 0m1.054s
Python:
time '/home/jacob/Bureaublad/pscript_9.py' '/home/jacob/Bureaublad/data_large' > '/home/jacob/Bureaublad/data_large2'
real 0m15.235s
user 0m13.806s
sys 0m1.279s
Em um arquivo menor, 51 KB, 838 linhas:
$ time perl -pe 's/(?<!;)\s*\n/ /' '/home/jacob/Bureaublad/data_small' > '/home/jacob/Bureaublad/data_small2'
real 0m0.008s
user 0m0.007s
sys 0m0.000s
Python:
$ time '/home/jacob/Bureaublad/pscript_9.py' '/home/jacob/Bureaublad/data_small' > '/home/jacob/Bureaublad/data_small2'
real 0m0.033s
user 0m0.019s
sys 0m0.011s
O resultado é que, se você tiver arquivos maiores, python
pode ser o que você gostaria de usar, se você tiver muitos arquivos menores, Perl
é a melhor opção.