Encontre e substitua pelo awk

0

Eu estou tentando grep coluna 4 com delimitador de pipe ( | ) e substituir todas as aspas duplas dentro dele e, em seguida, coloque essa seqüência de caracteres com aspas duplas novamente.

exemplo de arquivo:

col1|col2|col3|col4|col5|col6|col7|col8|col9
value1|value2|value3|"|||||value"4|value5|value6|"||value"7|value8|value9

O problema é que a coluna 4 é onde o usuário pode escrever qualquer coisa, até mesmo um pipe, que é meu delimitador e quebra meu processo.

Por exemplo coluna 4 pode ser

"|||||value"4

Agora estou tentando escrever o comando que vai para a coluna 4, substituir todas as aspas duplas e depois incluí-lo com aspas duplas novamente para que eu possa tratá-lo como uma única string para que meu processo funcione.

A saída necessária para a coluna 4 é

"|||||value4"

Da mesma forma eu fiz o mesmo para a coluna 7, a saída necessária para a coluna 7 é

"||value7"

A saída final deve ficar assim:

col1|col2|col3|col4|col5|col6|col7|col8|col9
value1|value2|value3|"|||||value4"|value5|value6|"||value7"|value8|value9

por favor sugira.

    
por jack swan 24.03.2018 / 15:32

2 respostas

1

Com sed , supondo que você tenha apenas 5 colunas e a coluna que deve ser citada é column4 no seu caso:

sed -E 's/"//g; s/^(([^|]*\|){3})(.*)(\|[^|]*)$/""/' infile

Isso funcionará mesmo se não houver cotações inseridas pelo usuário, se forem inseridas cotações por usuário ou por canal.

Aqui está uma solução awk também conforme solicitado:

$ awk -F'|' '{ for (i=1; i<NF; i++){if (i>3)gsub("\"",""); 
  printf (i!=(NF-1))?$i"|"((i==3)?"\"":""):$i"\"|"}; print $NF}' infile

col1|col2|col3|"col4"|col5
test|test_f|21/03/2017|"|||||USER RIGHTa anything here"|123
    
por 24.03.2018 / 17:07
2

Usando csvkit :

$ csvformat -d '|' -D '|' file.csv
col1|col2|col3|col4|col5
test|test_f|21/03/2017|"|||||USER RIGHTa anything here"|123

Os sinalizadores -d e -D definem o delimitador usado na entrada e na saída, respectivamente.

    
por 24.03.2018 / 15:41