Eu tenho um arquivo de texto que possui cerca de 15 colunas. Os campos são separados por vírgula. Uma coluna que é descrição está entre aspas duplas e também contém algumas palavras entre aspas duplas. Preciso manter as aspas duplas iniciais e finais e remover apenas as aspas duplas internas.
Algo assim:
"Hi there, we are from XYZ team, we have an "Opportunity" at our organization"
Eu preciso de saída como:
"Hi there, we are from XYZ team, we have an Opportunity at our organization"
Eu não quero ir para a programação Python. Eu estava procurando um comando awk ou qualquer outra melhor opção.
O arquivo pode ter 100 linhas de dados, mas esta coluna de descrição possui palavras entre aspas duplas para algumas linhas e não para todas as 100 linhas.
Aqui estão alguns dados de amostra:
invoice number,invoice date,vendor number,vendor site ID,supplier site CODE,invoice description,invoice currency code,invoice total amount,line number,line amount,line description,account code,business unit,business center,department,issue code,project,task number
1686,2024-03-28,258,9845,NEWYORK,CA Project: Content,USD,538,1,26,279.6,"Review new applications, and instruct the same.The deposits. Review correspondence applications. Review and applications. Research "Material Included" and artwork , and email. Communications with team website. Call, and communications.",230,,,,,295,10
Tenho que remover aspas duplas de "Material Incluído" na descrição da linha.
Observação: preciso do arquivo inteiro e reter todas as colunas, mas apenas remover as aspas duplas internas no valor da descrição da linha. Somente o campo de descrição da linha possui esses valores internos entre aspas duplas. Por enquanto, há apenas uma palavra interna entre aspas duplas aparecendo para a descrição da linha do arquivo, não notamos mais de uma.
Observação: não estou usando os dados fornecidos na pergunta, pois o número de campos de cabeçalho não parece corresponder ao número de campos de dados. Em vez disso, uso
printf
para criar um conjunto de dados simples com o mesmo problema de cotação descrito na pergunta.Usando Miller (
mlr
) conforme mostrado abaixo, você poderá converter as aspas duplas incorporadas problemáticas em aspas duplas incorporadas devidamente codificadas em CSV. Isso inclui duplicar cada caractere de aspas duplas incorporado:Isso criaria um documento CSV que qualquer analisador compatível com CSV seria capaz de ler corretamente, preservando as aspas incorporadas.
Para remover completamente as aspas duplas incorporadas, você pode usar Miller assim:
Isso é usado
mlr
para iterar todos os campos em todos os registros e para remover qualquer caractere de aspas duplas encontrado.Se um campo precisar ser citado por conter uma vírgula, Miller o citará:
O comando Miller novamente, mas por si só:
Se você souber o nome do campo que contém as aspas que deseja remover, por exemplo
line description
, , poderá simplificar o comando e remover o loop:Em vez de remover as aspas duplas sem escape da entrada, como acho que seria melhor se elas permanecessem, você poderia converter o arquivo malformado em um "caracteres de aspas duplas com escape de aspas duplas" adequado e padrão (peço desculpas ) CSV, onde aspas duplas (
""
) são usadas como meio de escapar delas quando dentro de campos de texto entre aspas.Isso pode ser feito automaticamente e endereçando todo o arquivo, sem a necessidade de endereçar linhas/campos específicos, usando o módulo Text::CSV do Perl (não instalado por padrão no Ubuntu, por exemplo
sudo apt install libtext-csv-perl
; IIRC é instalado por padrão no openSUSE Tumbleweed (caso contrário,zypper se
eu acho); mas em qualquer caso, é um módulo muito padrão e deve estar disponível na maioria/todas as distros Linux e, claro, ainda pode ser instalado em qualquer sistema que não o possua via CPAN).-Mstrict
, e-w
estão lá principalmente porque é padrão incluí-los (pelo menos ao escrever scripts Perl mais complexos), mas eles não são realmente necessários neste caso.O que isso faz é:
quote_character
("
) (este é o truque para permitir que o analisador leia"
caracteres como caracteres regulares quando dentro do padrãoquote-character
-delimitado limites do campo de texto); isso, combinado comallow_loose_quotes
, diz ao analisador para não reclamar ao ler um padrão sem escapequote_character
dentro de um campo de texto, forçando-o a ler o conteúdo dos campos de texto literalmente; um CSV de saída é então gerado usando opções padrão (que incluem citar campos de texto e duplicar aspas duplas dentro de campos de texto quando necessário) e impresso em STDOUT.Contanto que você tenha no máximo um único campo entre aspas por linha, você pode tentar usar
sed
seu recurso de ramificação, que lhe dá mais controle sobre quando fazer uma substituição:Ou diretamente da linha de comando:
Se fornecer o resultado esperado, você pode usar o
-i
sinalizador para aplicar as alterações ao arquivo.Para mais informações, confira o manual GNU: 6.4 Branching and Flow Control .
Se você puder ter no máximo 1 campo entre aspas por linha, poderá fazer o seguinte usando qualquer awk:
ou isto com qualquer sed que seja interpretado
\n
como nova linha (caso contrário, use\<literal newline>
):Se você puder ter mais de um campo entre aspas por linha, será impossível fazer esse trabalho de maneira robusta com qualquer ferramenta sem informações adicionais sobre como identificar cotações dentro dos campos e ao redor dos campos.
Os itens acima foram executados neste arquivo de entrada construído a partir das linhas de amostra da pergunta: