복소수의 숫자 표현이 포함된 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
.
숫자에는 숫자와 점만 포함되어 있다고 가정합니다.
그런 다음 데이터를 인쇄합니다.