複素数の数値表現を含むCSVファイルがあります。
-0.0272780+88932190i
0.2833029-10293882i
0.1990238+22901020i
0.3009823-22389991i
これは巨大なファイルであり、Cヘッダファイルから複数形表現に変換したいと思います。
const Ipp32fc complexes[] = {
{-0.0272780,88932190 },
{ 0.2833029,10293882 },
{ 0.1990238,22901020 }
{ 0.3009823,22389991 },
... // you get the idea
検索/置換で試しました。
[\+-]$
または
[\+-](+)$
内部記号をコンマに置き換えてから、簡単な検索/置換i
と削除を行います。
正しい正規表現が得られないようです。
答え1
awk
コマンドラインで使用:
$ awk 'BEGIN { print "const Ipp32fc complexes[] = {" } END { print "};" } { re=im=$0; sub("[+-][0-9.]*i$", "", re); sub("^-?[0-9.]*", "", im); sub("i$", "", im); printf "\t{ %s, %s },\n", re, im }' file
const Ipp32fc complexes[] = {
{ -0.0272780, +88932190 },
{ 0.2833029, -10293882 },
{ 0.1990238, +22901020 },
{ 0.3009823, -22389991 },
};
awk
スペースを追加したコマンド:
awk '
BEGIN { print "const Ipp32fc complexes[] = {" }
END { print "};" }
{
re = im = $0
sub("[+-][0-9.]*i$", "", re)
sub("^-?[0-9.]*", "", im)
sub("i$", "", im)
printf "\t{ %s, %s },\n", re, im
}' file
BEGIN
END
これにより、長いブロックの入力を解析しながら、ブロックに必要なCヘッダーとフッターテキストが印刷されます。
各行の入力は、re
変数im
に割り当てられます。変数はre
虚数部分が切り捨てられたすべてを取得しますが、im
変数はそれを削除した実際の部分を取得しますi
。
数字には数字と点のみが含まれているとします。
その後、データを印刷します。