Tener un archivo CSV como este:
HEADER
"first, column"|"second "some random quotes" column"|"third ol' column"
FOOTER
y buscando resultados como:
HEADER
first, column|second "some random quotes" column|third ol' column
en otras palabras, eliminar "FOOTER", comillas al principio, al final y alrededor |.
Hasta ahora este código funciona:
sed '/FOOTER/d' csv > csv1 | #remove FOOTER
sed 's/^\"//' csv1 > csv2 | #remove quote at the beginning
sed 's/\"$//' csv2 > csv3 | #remove quote at the end
sed 's/\"|\"/|/g' csv3 > csv4 #remove quotes around pipe
Como puede ver, el problema es que crea 4 archivos adicionales.
Aquí hay otra solución, que tiene el objetivo de no crear archivos adicionales y hacer lo mismo en un solo script. No funciona muy bien.
#!/bin/ksh
sed '/begin/, /end/ {
/FOOTER/d
s/^\"//
s/\"$//
s/\"|\"/|/g
}' csv > csv4
sed
no va a funcionar con eso, solo con csv simplificado. Use un lenguaje de programación con una biblioteca que pueda manejar archivos CSV reales (Python / Perl / Ruby).Respuestas:
En primer lugar, como lo mostró Michael, puedes combinar todo esto en un solo comando:
Creo que algunas
sed
implementaciones no pueden hacer frente a eso y podrían necesitar:Dicho esto, parece que sus campos están definidos por
|
y solo desea eliminar"
todo el campo, dejando los que están dentro del campo. En ese caso, podrías hacer:O con GNU
sed
:También puedes usar Perl:
fuente
Esto también funcionaría:
sed 's / ^ "//; s /" | "/ | / g; s /" "$ /" /'
Ejemplo:
versión bonita
fuente
FOOTER
, eliminará los datos deseados.