Avoir un fichier CSV comme ceci:
HEADER
"first, column"|"second "some random quotes" column"|"third ol' column"
FOOTER
et cherchant un résultat comme:
HEADER
first, column|second "some random quotes" column|third ol' column
autrement dit, supprimer "FOOTER", les guillemets au début, à la fin et autour de |.
Jusqu'à présent, ce code fonctionne:
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
Comme vous voyez le problème est qu'il crée 4 fichiers supplémentaires.
Voici une autre solution, qui a pour but de ne pas créer de fichiers supplémentaires et de faire la même chose dans un seul script. Ça ne marche pas très bien.
#!/bin/ksh
sed '/begin/, /end/ {
/FOOTER/d
s/^\"//
s/\"$//
s/\"|\"/|/g
}' csv > csv4
sed
ne va pas travailler avec cela, seulement avec CSV simplifié. Utilisez un langage de programmation avec une bibliothèque capable de gérer de vrais fichiers CSV (Python / Perl / Ruby).Réponses:
Tout d’abord, comme Michael l’a montré, vous pouvez combiner tout cela en une seule commande:
Je pense que certaines
sed
implémentations ne peuvent pas gérer cela et pourraient nécessiter:Cela dit, il semble que vos champs soient définis par
|
et que vous souhaitiez simplement les supprimer"
, en laissant ceux qui se trouvent dans le champ. Dans ce cas, vous pourriez faire:Ou, avec GNU
sed
:Vous pouvez aussi utiliser Perl:
la source
Cela fonctionnerait aussi:
sed 's / ^ "//; s /" | "/ | / g; s /" "$ /" /'
Exemple:
jolie version
la source
FOOTER
, les données recherchées seront supprimées.