sed를 사용하여 CSV에서 숫자 구분 쉼표와 따옴표 자체를 제거하시겠습니까? [복사]

sed를 사용하여 CSV에서 숫자 구분 쉼표와 따옴표 자체를 제거하시겠습니까? [복사]

sed를 사용하여 쉼표 앞의 숫자 그룹과 마지막 열의 따옴표 자체를 제거하는 방법은 무엇입니까?

아래 예에서는 대상 열이 큰따옴표로 묶이지 않았습니다.

0,1,,,"10,815,197",
6,7,010202,,"5,589",
6,7,010202,,589,

예상되는 결과는 다음과 같습니다.

0,1,,,10815197,
6,7,010202,,5589,
6,7,010202,,589,

답변1

Awk당신에게 최고의 시나리오가 될 것입니다.

$ awk -F'"' '{gsub(",", "", $2);print}' file.txt 
0,1,,, 10815197 ,
6,7,010202,, 5589 ,
6,7,010202,,589,

어떻게 작동하나요?

-F'"' - AWK레코드 구분 기호로 큰따옴표(")를 사용하게 됩니다.

gsub(",","",$2)- 이 gsub함수는 모든 큰따옴표를 검색하여 빈 문자열로 바꿉니다.

print - 수정된 내용을 출력물에 인쇄합니다.

답변2

사용하기가 더 쉬운 것 같아요 awk. 다음과 같이 시도해 볼 수 있습니다.

$ awk -v v='"' 'BEGIN{FS=OFS=v}{gsub(",","",$2);gsub("\"","",$0);print }' file.txt
0,1,,,10815197,
6,7,010202,,5589,
6,7,010202,,589,
  • 기본적으로 awk정규식을 -v v='"'필드 구분 기호로 사용하라는 의미입니다.
  • FS=OFS=v필드 구분 기호가 출력 필드 구분 기호와 동일하다고 말씀 하셨습니다 ".
  • gsub (",","",$2),두 번째 필드를 비어 있는 필드로 바꿉니다 $2(시작과 끝에서 구분됨 ").
  • gsub("\"","",$0)"라인을 인쇄하기 전에 전체 라인을 가져오고 무엇이든 교체하십시오.

답변3

sed는 이러한 목적에 적합한 도구가 아닙니다.

$ perl -pe 's|"([\d,]+)"(?=[^"]*$)|$1=~y/,//dr|eg' file
0,1,,,10815197,
6,7,010202,,5589,
6,7,010202,,589,

파이썬을 통해.

#!/usr/bin/python3
import sys
import re
file = sys.argv[1]
with open(file, 'r') as f:
    for line in f:
        print(re.sub(r'"([\d,]+)"(?=[^"]*$)', lambda m: m.group(1).replace(',', ''), line), end = "")

위 스크립트를 파일로 저장한 script.py후 터미널에서 다음 명령을 실행하여 실행하세요.

$ python3 script.py inputfile

관련 정보