포스트그레스로 가져올 수 있도록 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-,