Estou tentando gerar vários arquivos a partir de um .txt
arquivo com separadores. Neste caso, o separador de coluna é |
e o separador de registro é: ║
.
Este é o código que estou tentando:
awk -F'║', -vOFS=, -vc=1 '
NR == 1 {
for (i=1; i<NF; i++) {
if ($i != "") {
g[c]=i;
f[c++]=$i
}
}
}
NR>2 {
for (i=1; i < c; i++) {
print $1,$2, $g[i] > "output_"f[i]".tex"
}
}' biennalis.txt
O conteúdo biennalis.csv
é algo como isto:
name|content
║Is-id27-ref06-01-13-1914|El año de la muerte del rey Ozías vi al Señor sentado en un trono excelso y elevado, y sus haldas llenaban el templo. Unos serafines se mantenían erguidos por encima de él; cada uno tenía seis alas: con un par se cubrían la faz, con otro par se cubrían los pies, y con el otro par aleteaban, y se gritaban el uno al otro:
\textquote{Santo, santo, santo, el Señor de los ejércitos: llena está toda la tierra de su gloria.}.
Se conmovieron los quicios y los dinteles a la voz de los que clamaban, y la casa se llenó de humo.
Yo dije:
\textquote{¡Ay de mí, que estoy perdido, pues soy un hombre de labios impuros, y entre un pueblo de labios impuros habito: que al rey el Señor de los ejércitos han visto mis ojos!}
Entonces voló hacia mí uno de los serafines con una brasa en la mano, que con las tenazas había tomado de sobre el altar, y tocó mi boca y dijo:
\textquote{He aquí que esto ha tocado tus labios: se ha retirado tu culpa, tu pecado está expiado.}
Y percibí la voz del Señor que decía:
\textquote{¿A quién enviaré? ¿y quién irá de parte nuestra}?
Yo contesté:
\textquote{Heme aquí: envíame.}
Dijo:
\textquote{Ve y di a ese pueblo: \textquote{Escuchad bien, pero no entendáis, ved bien, pero no comprendáis.} Engorda el corazón de ese pueblo, hazle duro de oídos, y pégale los ojos, no sea que vea con sus ojos y oiga con sus oídos, y entienda con su corazón, y se convierta y se le cure.}
Yo pregunté:
\textquote{¿Hasta dónde, Señor?}
Y él me contestó:
\textquote{Hasta que se vacíen las ciudades y queden sin habitantes, las casas sin hombres, la campiña desolada, y haya alejado el Señor a las gentes, y cunda el abandono dentro del país. Aun el décimo que quede en él volverá a ser devastado como la encina o el roble, en cuya tala queda un tocón. Este tocón será semilla santa.}
║Is-id27-ref01-01-18-0045|Visión de Isaías, hijo de Amós, acerca de Judá y de Jerusalén, en tiempos de Ozías, Jotán, Ajaz y Ezequías, reyes de Judá.
Oíd, cielos, escucha tierra, que habla el Señor: \textquote{Hijos he criado y educado, y ellos se han rebelado contra mí.
El buey conoce a su amo, y el asno el pesebre de su dueño; Israel no me conoce, mi pueblo no comprende}.
¡Ay, gente pecadora, pueblo cargado de culpas, raza malvada, hijos corrompidos! Han abandonado al Señor, han despreciado al santo de Israel, le han vuelto la espalda.
O resultado final que espero são arquivos separados, cujo nome é o conteúdo da primeira coluna e o conteúdo é o que está na segunda coluna:
Is-id27-ref06-01-13-1914.tex
El año de la muerte del rey Ozías vi al Señor sentado en un trono excelso y elevado, y sus haldas llenaban el templo. Unos serafines se mantenían erguidos por encima de él; cada uno tenía seis alas: con un par se cubrían la faz, con otro par se cubrían los pies, y con el otro par aleteaban, y se gritaban el uno al otro:
\textquote{Santo, santo, santo, el Señor de los ejércitos: llena está toda la tierra de su gloria.}.
...
Is-id27-ref01-01-18-0045.tex
Visión de Isaías, hijo de Amós, acerca de Judá y de Jerusalén, en tiempos de Ozías, Jotán, Ajaz y Ezequías, reyes de Judá.
Oíd, cielos, escucha tierra, que habla el Señor: \textquote{Hijos he criado y educado, y ellos se han rebelado contra mí.
...
Etc...
O erro ao executar o comando é o seguinte:
awk: syntax error at source line 10
context is
print $1,$2, $g[i] > >>> "output_"f <<< [i]".tex"
awk: illegal statement at source line 10
Seu script parece estar fazendo algo bem diferente do que você está tentando. Supondo que o arquivo de entrada real esteja bem formatado, vamos abandonar o que você tinha e tentar novamente.
Isso divide qualquer linha com
║
ou|
dentro dela, e usa o primeiro campo como base do novo nome de arquivo. Ele pega qualquer coisa antes║
e anexa isso ao arquivo aberto anteriormente, se houver um, então o delimitador pode ocorrer em qualquer lugar em uma linha; mas isso quebrará de maneiras peculiares se uma linha contiver mais de um de cada delimitador.Isso pressupõe fundamentalmente que você tenha um
║
antes da primeira entrada e|
entre o nome do arquivo e o texto que você deseja nele.Demonstração: https://ideone.com/jsRJKf
Minha resposta original funciona bem no Linux, mas não no MacOS:
Simplesmente instruímos o Awk a usar os separadores de registro e campo apropriados e, então, o instruímos a imprimir o segundo campo em um arquivo cujo nome é derivado do primeiro.
Como acima, para que isso funcione, você precisa ter um
║
antes da primeira entrada e|
entre o nome do arquivo e o texto que você deseja nele.Demonstração: https://ideone.com/LU1y4Y
Uma expressão sem parênteses no lado direito do redirecionamento de entrada ou saída é um comportamento indefinido e, portanto, diferentes awks farão coisas diferentes com ela, algumas farão o que você quer, enquanto outras falharão, como você está vendo atualmente. Altere isso:
para isso:
para resolver esse problema específico.
O próximo problema que você pode encontrar é que você não está fechando os arquivos de saída conforme avança e, portanto, você pode atingir um limite de quantos arquivos um processo pode ter abertos ao mesmo tempo. Para consertar isso, altere seu loop para:
A
if
instruçãoseen[]
é para garantir que o script esvazie qualquer arquivo de saída existente na primeira vez que o script gravar nele. Se você manipular isso fora do script, poderá remover essaif
instrução.