Alterar o delimitador de campo e caractere de citação

0

Eu gostaria de modificar o conteúdo de dois arquivos diferentes. Como posso obter o resultado esperado usando um script genérico no unix?

1º arquivo: " dentro da string citada, " e , (separador) dentro da string entre aspas

exemplo:

"20181115","12345643","This is a "test"","","657","This is a "TEST"","","aaaa"
"20181115","12345632","This is an "example" of the file, a "sample" aaaa","123","",""TEST"","",""

saída esperada:

~20181115~;~12345643~;~This is a "test"~;~~;~657~;~This is a "TEST"~;~~;~aaaa~
~20181115~;~12345632~;~This is an "example" of the file, a "sample" aaaa~;~123~;~~;~"TEST"~;~~;~~

2º arquivo: | (separador) dentro da string entre aspas e vários " dentro da string

exemplo:

"098789"|"Hello world!"| 12,7|"Cities I want to visit Rome| London"|15.11.2018|"Yes"
"032425"|"Travel in ""New York"", USA"| 113,3||15.11.2018|"Yes"

saída esperada:

~098789~;~Hello world!~; 12,7;~Cities I want to visit Rome| London~;15.11.2018;~Yes~
~032425~;~Travel in /"New York/", USA~; 113,3;;15.11.2018;~Yes~
    
por Mathew Linton 15.11.2018 / 20:38

1 resposta

0

Experimente substituições simples de sed para o seu primeiro problema:

sed 's/","/~;~/g; s/^"\|"$/~/g' file

e um script awk mais usado para o segundo:

awk -F\" '{$1=$1; for (i=2; i<=NF; i+=2) gsub ("\|", SUBSEP, $i); gsub ("\|", ";"); gsub ("~~", "/\""); gsub (SUBSEP, "|")} 1' OFS="~" file 

Primeiro substitui todos os | entre aspas duplas por um espaço reservado incomum que não é comumente encontrado em arquivos de texto, depois faz as substituições desejadas e, em seguida, inverte a substituição de espaço reservado.

Por favor, esteja ciente de que ambos são adaptados aos seus problemas e, portanto, geralmente não são aplicáveis a outros problemas, mesmo semelhantes, sem adaptação.

Saída se aplicada à amostra em sua pergunta (Ubuntu, mawk 1.3.3 Nov 1996):

~098789~;~Hello world!~; 12,7;~Cities I want to visit Rome| London~;15.11.2018;~Yes~
~032425~;~Travel in /"New York/", USA~; 113,3;;15.11.2018;~Yes~
    
por 16.11.2018 / 09:58