CSV 파일에서 위치 연산자 변경

CSV 파일에서 위치 연산자 변경

포스트그레스로 가져올 수 있도록 CSV 파일을 편집하고 있습니다. 이 시점에서 해당 열의 왼쪽에 있는 열 5에서 값이 음수 "-"일 때 연산자를 변경하고 싶습니다. "+"인 연산자를 제거하고 싶습니다.

현재 CSV:

10013534,2021-01-01,I,0090922002,000000000009102629+,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0091000002,000000000063288833-,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0091100005,000000000063288833-,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0091110002,000000000063288833+,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0099999995,000000008017897139-,000000000000000000-,000000000000000000-,

그것은 어떤 모습이어야 하는가

10013534,2021-01-01,I,0090922002,000000000009102629,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0091000002,-000000000063288833,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0091100005,-000000000063288833,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0091110002,000000000063288833,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0099999995,-000000008017897139,000000000000000000-,000000000000000000-,

필요한 경우 열 6과 7을 삭제합니다.

답변1

이 같은:

awk -F "," '{sign=substr($5,length($5),1);$5=substr($5,0,length($5)-1); if(sign =="-"){$5="-"$5}; print}' ./mycsv

답변2

당신은 시도하고 싶을 수도 있습니다

function movesign (TMP) {IX  = sub (/\+$/, "&", TMP)       # create increment based on sign, so
                                                           # to drop the plus signs
                         return substr (TMP TMP, length(TMP) + IX, length(TMP) - IX)
                                                           # by writing the string twice, and chop-
                                                           # ping it off at the right position with
                                                           # the right length, we get the desired result
                        }                       

/^#/    {pfx = substr($0, 8, 7) OFS substr($0, 32, 4) "-" substr($0, 30, 2) "-01" OFS substr($0, 36) 
                                                           # prepare prefix from header lines
         sub (/ *$/, "", pfx)                              # trim trailing spaces
         next
        }
/^@/    {next
        }

        {gsub(/[+-]/, "&,")                                # massage the input line into the right shape
          sub(/[, ]*$/, "")
         gsub(/  */, ",")

         $1 = pfx OFS $1                                   # prepend the prefix
         $0 = $0                                           # and recalculate the fields

         $5 = movesign($5)                                 # use function to taste
#        $6 = movesign($6)
#        $7 = movesign($7)
        }
1
' OFS=, *.csv

지금까지 얻은 답변을 훔치지만 단번에 효과가 있을 것입니다 .csv. cwd댓글의 논리를 확인하고 문제가 있으면 다시 오세요.

답변3

구조가 동일하게 유지되고 열 5가 10개 이상의 정수 문자가 포함된 쉼표 뒤의 첫 번째 일치 항목이라고 가정하면 sed문자가 발견되면 대시를 이동하고 문자가 발견되면 대시를 제외하여 이를 시도해 볼 수 있습니다.-+

$ sed 's/,\([0-9]\{10,\}[^,]*\)\(-\)\|+,/,\2\1/' input_file
10013534,2021-01-01,I,0090922002,000000000009102629,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0091000002,-000000000063288833,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0091100005,-000000000063288833,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0091110002,000000000063288833,000000000000000000-,000000000000000000-,
10013534,2021-01-01,I,0099999995,-000000008017897139,000000000000000000-,000000000000000000-,

관련 정보