이 시나리오는 CSV 파일에 있습니다.
ID,PRICE,QUANTITY,ARRIVAL
01299,"41,5",1,0
26528,"412,03",0,0
38080,"2,35",0,0
38081,"2,35",0,0
..
..
내가 스스로 묻는 질문은 다음과 같습니다. 을 어떻게 바꿀 수 있습니까? 단 ,
, .
가격만 큰따옴표로 묶인 열에 대해서만 "..."
가능 PRICE
합니까?
나는 전에 시도했다
sed -i 's/\(,\)[^ ]*\( .*\)/\1"."\2/'
하지만 성공하지 못한 경우 힌트를 주실 수 있나요?
답변1
정규식을 확장하려면 sed의 "-E" 옵션을 사용하는 것이 좋습니다. 따옴표 사이에 숫자만 있는 경우 다음을 수행할 수 있습니다.
~ $ cat foo
lorem, ipsum
"5,25", foobar
"foo,bar", foobar
~ $ cat foo | sed -E 's/"([0-9]+)\,([0-9]+)"/"\1.\2"/g'
lorem, ipsum
"5.25", foobar
"foo,bar", foobar
따옴표에 대문자와 소문자가 포함된 경우 다음과 같이 정규식을 확장할 수 있습니다.
~ $ cat foo | sed -E 's/"([0-9]+|[a-z]+|[A-Z]+)\,([0-9]+|[a-z]+|[A-Z]+)"/"\1.\2"/g'
lorem, ipsum
"5.25", foobar
"foo.bar", foobar
regex101.com에서 정규식을 쉽게 테스트할 수 있습니다. 참고 항목:https://regex101.com/r/mlfSmp/1
답변2
csvformat
다음에서 사용csvkit:
$ csvformat -D ';' file | tr , . | csvformat -d ';'
ID,PRICE,QUANTITY,ARRIVAL
01299,41.5,1,0
26528,412.03,0,0
38080,2.35,0,0
38081,2.35,0,0
위 명령은 CSV 구분 기호를 기본 쉼표에서 세미콜론으로 변경합니다. 그런 다음 나머지 쉼표를 점으로 변경한 다음 필드 구분 기호를 다시 쉼표로 변경합니다.
또는 다음 명령을 사용하여 CSV를 JSON으로 변환 csvjson
하고 데이터를 수정합니다 jq
.
$ csvjson -I file | jq -r '(.[0] | keys_unsorted | @csv), (map(.PRICE |= sub(",";".") | [.[]] | @csv)[])'
"ID","PRICE","QUANTITY","ARRIVAL"
"01299","41.5","1","0"
"26528","412.03","0","0"
"38080","2.35","0","0"
"38081","2.35","0","0"
csvformat
불필요한 따옴표를 제거하려면 인수 없이 이 인수를 전달하십시오.
이 jq
표현식은 먼저 입력 배열의 첫 번째 객체에서 키를 가져와 헤더를 출력합니다. 그런 다음 각 요소의 필드를 수정하고 PRICE
(쉼표를 점으로 변경) 출력을 위해 값을 CSV로 형식화합니다.
두 번째 변형과 첫 번째 변형의 효과 차이는 열에만 영향을 미친다는 것입니다 PRICE
. 다른 필드에 포함된 쉼표는 변경되지 않습니다.
참고로 질문의 CSV 데이터를 고려하여 다음 jq
에서 얻은 JSON 문서를 참조하세요.csvjson
[
{"ID":"01299","PRICE":"41,5","QUANTITY":"1","ARRIVAL":"0"},
{"ID":"26528","PRICE":"412,03","QUANTITY":"0","ARRIVAL":"0"},
{"ID":"38080","PRICE":"2,35","QUANTITY":"0","ARRIVAL":"0"},
{"ID":"38081","PRICE":"2,35","QUANTITY":"0","ARRIVAL":"0"}
]
답변3
이것을 조정하다답변도착하다쉼표로 구분된 파일에서 따옴표 사이의 쉼표만 제거합니다.해결책 awk
:
awk -F'"' -v OFS='"' '{ for (i=2; i<=NF; i+=2) gsub(",", ".", $i) } 1' infile
infile
어디
ID,PRICE,QUANTITY,ARRIVAL
01299,"41,5",1,0
26528,"412,03",0,0
38080,"2,35",0,0
38081,"2,35",0,0
밝혀지다
ID,PRICE,QUANTITY,ARRIVAL
01299,"41.5",1,0
26528,"412.03",0,0
38080,"2.35",0,0
38081,"2.35",0,0
코드에 대한 설명은 인용된 답변과 동일하므로 다음을 제외하고는 반복하지 않겠습니다.
- 출력 필드 구분 기호는 이제 비어 있는
"
(예:OFS='"'
) 대신(예:OFS=''
)입니다. - 이제
gsub
쉼표(","
) 를"."
공백( ) 대신 마침표(""
) 로 바꿉니다.