데이터가 " "로 묶여 있고 그 사이에 쉼표가 있는 필드가 있는 csv 파일이 있습니다. 다른걸로 교체하고 싶어요

데이터가 " "로 묶여 있고 그 사이에 쉼표가 있는 필드가 있는 csv 파일이 있습니다. 다른걸로 교체하고 싶어요

아래는 내 파일의 처음 5줄입니다. 여기서는 5번째 열의 "10,00,000.0"을 "10,000,000.0"으로 바꾸고 싶습니다.

DE000A2200V7,09:30:00,8.5,8.509,"10,00,000.0","10,00,000.0","850,450.0"
DE000A2200V7,11:30:00,8.7,8.709,"20,00,000.0","20,000.0","870,450.0"
DE000A2200V7,13:30:00,8.763,8.883,"30,00,000.0","20,000.0","882,300.0"
DE000A2200V7,15:30:00,8.481,8.501,"10,00,000.0","10,00,000.0","849,100.0"
DE000A2200W5,09:30:00,15.826,15.835,"20,000.0","20,000.0","1,583,050.0"

답변1

from을 사용하여 CSV 구분 기호를 @(또는 아직 데이터의 일부가 아닌 다른 문자) 로 일시적으로 변경합니다.csvformatcsvkit를 사용하여 5번째 필드의 관련 문자열을 변경 awk하고 구분 기호를 원래 쉼표로 반환합니다.

csvformat -D '@' data.csv |
awk 'BEGIN { OFS=FS="@" } $5 == "10,00,000.0" { $5 = "10,000,000.0" }; 1' |
csvformat -d '@'

의 데이터를 사용하면 data.csv다음이 생성됩니다.

DE000A2200V7,09:30:00,8.5,8.509,"10,000,000.0","10,00,000.0","850,450.0"
DE000A2200V7,11:30:00,8.7,8.709,"20,00,000.0","20,000.0","870,450.0"
DE000A2200V7,13:30:00,8.763,8.883,"30,00,000.0","20,000.0","882,300.0"
DE000A2200V7,15:30:00,8.481,8.501,"10,000,000.0","10,00,000.0","849,100.0"
DE000A2200W5,09:30:00,15.826,15.835,"20,000.0","20,000.0","1,583,050.0"

답변2

다음 sed명령을 사용하여 이 작업을 수행할 수 있습니다.

sed -i 's/^\(\([^,]*,\)\{4\}\)\("[^"]*"\)\(.*\)$/\1"10,000,000.0"\4/' data.csv

답변3

"20,00,000.0"이 맞나요? 그렇지 않다면 시도해보십시오.

sed 's/,00,/,000,/' file

모든 잘못된 번호를 치료해야 하는 경우 플래그 s를 추가하세요 ...g

답변4

GNU와 함께awk

awk -vFPAT='([^,]*)|("[^"]+")' -vOFS=, '$5 == "\"10,00,000.0\"" \
{ $5="\"10,000,000.0\""}; {print}' file

테스트

$ cat file
DE000A2200V7,09:30:00,8.5,8.509,"10,00,000.0","10,00,000.0","850,450.0"
DE000A2200V7,11:30:00,8.7,8.709,"20,00,000.0","20,000.0","870,450.0"
DE000A2200V7,13:30:00,8.763,8.883,"30,00,000.0","20,000.0","882,300.0"
DE000A2200V7,15:30:00,8.481,8.501,"10,00,000.0","10,00,000.0","849,100.0"
DE000A2200W5,09:30:00,15.826,15.835,"20,000.0","20,000.0","1,583,050.0"

$ awk -vFPAT='([^,]*)|("[^"]+")' -vOFS=, '$5 == "\"10,00,000.0\"" { $5="\"10,000,000.0\""}; {print}' file
DE000A2200V7,09:30:00,8.5,8.509,10,000,000.0,"10,00,000.0","850,450.0"
DE000A2200V7,11:30:00,8.7,8.709,"20,00,000.0","20,000.0","870,450.0"
DE000A2200V7,13:30:00,8.763,8.883,"30,00,000.0","20,000.0","882,300.0"
DE000A2200V7,15:30:00,8.481,8.501,10,000,000.0,"10,00,000.0","849,100.0"
DE000A2200W5,09:30:00,15.826,15.835,"20,000.0","20,000.0","1,583,050.0"

설명

-vFPAT='([^,]*)|("[^"]+")' 

필드를 쉼표로 구분하여 필드에 쉼표가 포함될 수 있는 경우를 처리합니다(GNU awk 매뉴얼 참조)콘텐츠별로 필드 정의).

-vOFS=,

출력 파일 구분 기호가 쉼표임을 나타냅니다 ,.

'$5 == "\"10,00,000.0\"" { $5="\"10,000,000.0\""}; {print}'

다섯 번째 열이 "10,00,000.0" 문자열과 일치하면 "10,000,000.0"으로 바꿉니다. 라인을 인쇄하십시오.

관련 정보