여러 열의 숫자 끝에 -(빼기) 기호를 제거하고 삭제된 열에 삽입해야 함

여러 열의 숫자 끝에 -(빼기) 기호를 제거하고 삭제된 열에 삽입해야 함

숫자 끝에 -(빼기) 기호가 있는 거대한 csv 파일이 있습니다. 이제 이 빼기 기호를 숫자의 시작 부분으로 이동해야 합니다. 즉, 마지막 문자("-" 기호가 있는 경우)를 제거하고 앞에 "-" 기호를 넣어야 합니다.

0.00,70440.19-,18.31-,0.00,451.59-,13788.77-,44.19-,6289.29-
1.03-,39.24-,0.11-,16.96-,0.00,72377.70-,0.00,146673.67-,59.11-,0.00

다음 방법을 시도했지만 10진수 값 "."이 있으면 앞에 빼기 기호를 추가합니다.

perl -pe 's#(\d{1,})(-)#$2$1#'g  file

출력은 다음과 같습니다.

0.00,70440.-19,18.-31,0.00,451.-59,13788.-77,44.-19,6289.-29
1.-03,39.-24,0.-11,16.-96,0.00,72377.-70,0.00,146673.-67,59.-11,0.00

작업을 수행할 awk/sed/perl 라이너를 제안해 주세요.

감사합니다, 비노.

답변1

아래 솔루션이 작동합니다. 다른 awk 또는 sed 솔루션을 알아두면 좋을 것입니다.

perl -pe 's#(\d{1,}[.]\d{1,})(-)#$2$1#'g  file

답변2

Perl 명령과 동일합니다.

$ sed 's/\([0-9]\+\.[0-9]\+\)-/-\1/g' file
0.00,-70440.19,-18.31,0.00,-451.59,-13788.77,-44.19,-6289.29
-1.03,-39.24,-0.11,-16.96,0.00,-72377.70,0.00,-146673.67,-59.11,0.00

또 다른 Perl 한 줄짜리,

$ perl -pe 's/([^,\n]*?)-/-\1/g' file
0.00,-70440.19,-18.31,0.00,-451.59,-13788.77,-44.19,-6289.29
-1.03,-39.24,-0.11,-16.96,0.00,-72377.70,0.00,-146673.67,-59.11,0.00

답변3

또 다른 펄

perl -F, -lane 'print join ",", map {(/-$/ && chop) . $_} @F' file

답변4

다음은 일부입니다:

  1. 더 짧은 펄

    perl -pe 's/([\d.]+)-/-$1/g' file 
    
  2. (GNU) sed

    sed -r 's/([0-9.]+)-/-\1/g' file 
    
  3. 모든 sed

    sed 's/\([0-9.]*\)-/-1\1/g' file 
    
  4. 어리석게도. 다양한 awk 변형은 캡처 모드와 관련된 작업에 그다지 좋지 않습니다. GNU awk(gawk) 및 다른 사람들이 이 작업을 수행할 수 있지만 저는 위의 솔루션 중 하나를 사용하겠습니다.

    gawk -F, '{
                for(i=1; i<NF; i++){
                    if(sub(/-/,"",$i)){printf "-%s,",$i}
                    else{printf "%s,",$i}
                }
                if(sub(/-/,"",$NF)){print "-"$NF}
                else{print $NF} }' file 
    

    이 작업을 수행하는 더 나은 awk 방법이 분명 있을 것이라고 확신하지만 위의 방법은 보기 흉하고 번거롭기는 하지만 여전히 작동합니다.

  5. 불필요하게 복잡함

    perl -pe 's/\n/\n\n/; s/,/\n/g; ' file | 
        awk -F"-"  '/-/{printf "-";}{print $1}' | 
            perl -000ne 's/\n./,/g;s/\n\n/\n/g; print'
    

관련 정보