web-dev-qa-db-fra.com

Joignez plusieurs commandes sed dans un seul script pour le traitement du fichier CSV

Avoir un fichier CSV comme celui-ci:

HEADER
"first, column"|"second "some random quotes" column"|"third ol' column"
FOOTER

et en recherchant un résultat comme:

HEADER
first, column|second "some random quotes" column|third ol' column

en d'autres termes, supprimer "FOOTER", les guillemets au début, à la fin et autour |.

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 le voyez, le problème est qu'il crée 4 fichiers supplémentaires.

Voici une autre solution, qui a pour objectif 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
37
Bor

Tout d'abord, comme Michael l'a montré, vous pouvez simplement combiner tout cela en une seule commande:

sed '/^FOOTER/d; s/^\"//; s/\"$//; s/\"|\"/|/g' csv > csv1

Je pense que certaines implémentations sed ne peuvent pas y faire face et pourraient avoir besoin de:

  sed -e '/^FOOTER/d' -e 's/^\"//' -e 's/\"$//' -e 's/\"|\"/|/g' csv > csv1

Cela dit, il semble que vos champs soient définis par | et vous voulez juste supprimer " sur tout le champ, en laissant ceux qui sont dans le champ. Dans ce cas, vous pourriez faire:

$ sed '/FOOTER/d; s/\(^\||\)"/\1/g; s/"\($\||\)/\1/g' csv 
HEADER
first, column|second "some random quotes" column|third ol' column

Ou, avec GNU sed:

sed -r '/FOOTER/d; s/(^|\|)"/\1/g; s/"($|\|)/\1/g' csv 

Vous pouvez également utiliser Perl:

$ Perl -F"|" -lane 'next if /FOOTER/; s/^"|"$// for @F; print @F' csv 
HEADER
first, column|second some random quotes column|third ol' column
51
terdon

Cela fonctionnerait également:

sed 's/^ "//; s /" | "/ |/g; s /" "$ /" /'

Exemple:

$ echo '"this"|" and "ths""|" and "|" this 2"|" also "this", "thi", "and th""' | 
sed 's/^"//; s/"|"/|/g; s/""$/"/'
this| and "ths"| and | this 2| also "this", "thi", "and th"

jolie version

sed '
s/^"//
s/"|"/|/g
s/""$/"/
$d
'
16
Michael Durrant

La commande sed qui a fonctionné pour moi est:

sed 's/ALA/A/g;s/CYS/C/g;s/ASP/D/g;s/GLU/E/g;s/PHE/F/g;s/GLY/G/g;s/HIS/H/g;s/HID/H/g;s/HIE/H/g;s/ILE/I/g;s/LYS/K/g;s/LEU/L/g;s/MET/M/g;s/ASN/N/g;s/PRO/P/g;s/GLN/Q/g;s/ARG/R/g;s/SER/S/g;s/THR/T/g;s/VAL/V/g;s/TRP/W/g;s/TYR/Y/g;s/MSE/X/g;s/ //g'  < old.txt > new.fasta

Les commandes sed ne peuvent pas être canalisées. Il doit être donné comme une seule commande.

0
Angana