このようなCSVファイルを持っている:
HEADER
"first, column"|"second "some random quotes" column"|"third ol' column"
FOOTER
そして次のような結果を探します:
HEADER
first, column|second "some random quotes" column|third ol' column
言い換えると、「FOOTER」、引用符の最初、最後、および前後の引用符を削除します。
これまでのところ、このコードは機能します:
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
問題を見ると、4つの追加ファイルが作成されます。
これは、余分なファイルを作成せず、1つのスクリプトで同じことを行うという目標を持つ別のソリューションです。うまく機能しません。
#!/bin/ksh
sed '/begin/, /end/ {
/FOOTER/d
s/^\"//
s/\"$//
s/\"|\"/|/g
}' csv > csv4
まず、マイケルが示したように、これらすべてを1つのコマンドに組み合わせることができます。
sed '/^FOOTER/d; s/^\"//; s/\"$//; s/\"|\"/|/g' csv > csv1
一部のsed
実装はこれに対応できず、必要になる可能性があります。
sed -e '/^FOOTER/d' -e 's/^\"//' -e 's/\"$//' -e 's/\"|\"/|/g' csv > csv1
とはいえ、フィールドは|
によって定義されているようで、フィールド全体の"
を削除して、フィールド内にあるフィールドは残したいだけです。その場合、次のことができます。
$ sed '/FOOTER/d; s/\(^\||\)"/\1/g; s/"\($\||\)/\1/g' csv
HEADER
first, column|second "some random quotes" column|third ol' column
または、GNU sed
:
sed -r '/FOOTER/d; s/(^|\|)"/\1/g; s/"($|\|)/\1/g' csv
Perlを使用することもできます。
$ Perl -F"|" -lane 'next if /FOOTER/; s/^"|"$// for @F; print @F' csv
HEADER
first, column|second some random quotes column|third ol' column
これも機能します:
例:
$ 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"
かわいいバージョン
sed '
s/^"//
s/"|"/|/g
s/""$/"/
$d
'
私のために働いたsed
コマンドは:
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
Sedコマンドはパイプできません。単一のコマンドとして指定する必要があります。