recorte o primeiro e último elemento em CSV

4

Eu tenho uma matriz em um arquivo CSV como

input.csv
"{1,2,3,4}"
"{1,2,3,4,5,6,7,8,9}"
"{34,6,7,89}"

Eu quero obter o primeiro e o último elemento deste arquivo CSV como outro arquivo CSV

output.csv
    1,4
    1,9
    34,89

Eu tentei com

  cut -d , -f1 -- complement input.csv > output.csv

Eu sei que isso funciona para CSV normal. Mas aqui eu tenho chaves e ""  também.

    
por joker21 26.12.2016 / 10:10

5 respostas

3

Eu faria assim com sed

$ sed -r 's/"\{([0-9]+,).*,([0-9]+)\}"//' input
1,4
1,9
34,89

Notas

  • -r use ERE
  • \} literal {
  • ([0-9]+,) salva alguns dígitos seguidos por uma vírgula para mais tarde
  • de referência aos padrões salvos

(sua saída é indentada, - talvez você queira / / ou /\t/ na substituição - ajuste como quiser)

    
por 26.12.2016 / 11:05
2

Um caminho:

awk -F"[}{,]" '{print $2, $(NF-1)}' OFS=,  file

Você pode usar as chaves também como delimitadores e, portanto, os elementos podem ser acessados diretamente.

    
por 26.12.2016 / 10:28
2

Usando sed :

sed -e 's/,.*,/,/' -e 's/[^0-9,]//g' file

O primeiro comando s substitui tudo entre a primeira e a última vírgula por uma vírgula, eliminando efetivamente todo o conteúdo entre eles.

O segundo comando s remove todos os caracteres que não são um dígito ou uma vírgula.

    
por 26.12.2016 / 10:34
1

este código funcionará para você

cat input.csv|sed 's/\"//g'|sed 's/{//g'|sed 's/}//g'|awk -F "," '{print $1,",",$NF}'|tr -d " " > output.csv

sed 's/\"//g' eliminará o ", sed 's/{//g'|sed 's/}//g' irá eliminar as chaves, awk -F "," '{print $1,",",$NF}' vai te dar esse resultado

1 , 4
1 , 9
34 , 89

e tr -d " " eliminarão os espaços na saída

    
por 26.12.2016 / 10:23
-1
sed -r "s/(\"|\{|\})//g" input.csv|awk -F, '{print $1","$NF}'
    
por 26.12.2016 / 10:33