Remover coluna específica se existir no arquivo CSV

0

Eu tenho um arquivo CSV que contém cerca de 25 colunas. Algumas linhas do arquivo contêm 26 colunas, de modo que eu quero procurar as linhas que contêm essa coluna extra e removê-lo para poder usar o awk com o arquivo inteiro.

Os campos são separados por ; Ponto e vírgula . A coluna extra está no formato VARNAME="O texto está aqui" e o valor "o texto está aqui" é um texto arbitrário.

Consegui remover o VARNAME de todas as linhas, mas não consigo explorar um padrão que corresponda ao valor arbitrário (o texto citado).

Meu alvo é encontrar linhas com essa coluna extra ( VARNAME="Texto está aqui" ) e removê-lo.

Exemplo:

Arquivo atual:

ROW1: VAR1:"Value 1";VAR2="Value 2";VAR3="Value 3"
ROW2: VAR1:"Value 4";VAR2="Value 5";VAREXT="Different Values";VAR3="Value 6"

O arquivo de destino deve ser:

ROW1: VAR1:"Value 1";VAR2="Value 2";VAR3="Value 3"
ROW2: VAR1:"Value 4";VAR2="Value 5";VAR3="Value 6"
    
por Akkosh 01.06.2017 / 15:22

2 respostas

2

Você pode usar algo como:

sed 's/;VAREXT.[^;]*//' file  #combine with -i for in-place editing

Teste:

a=$'"ROW2: VAR1:"Value 4";VAR2="Value 5";VAREXT="Different Values";VAR3="Value 6"'
b=$'"ROW2: VAR1:"Value 4";VAR2="Value 5";VAREXT="1234567";VAR3="Value 6"'
c=$'"ROW2: VAR1:"Value 4";VAR2="Value 5";VAREXT="VAREXT";VAR3="Value 6"'

echo "$a" |sed 's/;VAREXT.[^;]*//'
echo "$b" |sed 's/;VAREXT.[^;]*//'
echo "$c" |sed 's/;VAREXT.[^;]*//'

"ROW2: VAR1:"Value 4";VAR2="Value 5";VAR3="Value 6"
"ROW2: VAR1:"Value 4";VAR2="Value 5";VAR3="Value 6"
"ROW2: VAR1:"Value 4";VAR2="Value 5";VAR3="Value 6"
    
por 01.06.2017 / 16:46
1

Esperando que seu csv não tenha cabeçalho, não há espaços após o ponto-e-vírgula e apenas um VAREXT... por linha e, em seguida, com relação à sua amostra, tente:

sed 's/;VAREXT=\"[A-Za-z0-9 ]*\"//' in.csv

Onde o valor de VAREXT pode ser um composto de letras, dígitos e espaços.

    
por 01.06.2017 / 16:23