숫자 끝에 -(빼기) 기호가 있는 거대한 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
다음은 일부입니다:
더 짧은 펄
perl -pe 's/([\d.]+)-/-$1/g' file
(GNU) sed
sed -r 's/([0-9.]+)-/-\1/g' file
모든 sed
sed 's/\([0-9.]*\)-/-1\1/g' file
어리석게도. 다양한 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 방법이 분명 있을 것이라고 확신하지만 위의 방법은 보기 흉하고 번거롭기는 하지만 여전히 작동합니다.
불필요하게 복잡함
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'