쉼표로 밑줄 바꾸기 및 CSV에서 큰 따옴표 제거


10

CSV 파일이 있습니다

input.csv

"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
"1_1_0_0_79"
"1_1_0_0_80"
"1_1_0_0_81"
"1_1_0_0_82"
"1_1_0_0_83"
"1_1_0_0_84"
"1_1_0_0_85"

............. 등등.

이 CSV 파일을로 변환해야합니다

result.csv 

1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
1,1,0,0,79
1,1,0,0,80
1,1,0,0,81
1,1,0,0,82
1,1,0,0,83
1,1,0,0,84
1,1,0,0,85

답변:


24

훨씬 간단한 방법은 사용하는 것입니다 tr

$ tr '_' ',' < input.csv | tr -d '"'                  
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

이것이 작동하는 방식 tr은 두 개의 인수, 즉 교체 할 문자 세트와 교체 인수 를 취하는 것입니다. 이 경우에는 1 자 세트 만 있습니다. 쉘 연산자 를 통해 input.csv입력 tr의 stdin 스트림을 리디렉션 <하고 결과 출력을 파이프하여 tr -d '"'큰 따옴표를 삭제합니다.

하지만 awk그렇게 할 수도 있습니다.

$ cat input.csv
"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
$ awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

이것이 작동하는 방식은 약간 다릅니다. awk는 각 파일을 한 줄씩 읽으며 각 인라인 스크립트는 /Pattern match/{ codeblock}/Another pattern/{code block for this pattern}입니다. 여기에는 패턴이 없으므로 각 줄에 대해 코드 블록을 실행하는 것을 의미합니다. gsub()함수는 한 줄 내에서 전역 대체에 사용되므로 밑줄을 쉼표로 바꾸고 큰 따옴표를 null 문자열로 대체하여 효과적으로 문자를 삭제합니다. 는 1기본적으로 단순히 라인을 인쇄하는 코드 블록을, 누락 된 패턴 매치의 장소에; 다시 말해서 with with codeblock gsub()이 작업을 수행하고 1결과를 인쇄합니다.

쉘 리디렉션을 (사용하여 >새 파일로 출력을 보낼 수) :

 awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv

사과 따위는 또한 인용 부호를 제거하고 싶어 질문을 업데이트 이고요
RKR

@RKR 답변 따라서 업데이트, 이안의 답변도 업데이트됩니다
Sergiy Kolodyazhnyy

13

대안으로이 sed명령 을 사용할 수도 있습니다 .

$ sed -e 's/_/,/g' -e 's/"//g' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

1
작은 따옴표 내에서 큰 따옴표를 이스케이프 처리하지 않아도됩니다.
glenn jackman

사실 @glennjackman! 방금 탈출 백 슬래시를 제거했습니다
IanC

10

명령 행 텍스트 처리의 "스위스 군 전기 톱"인 Perl도이를 수행 할 수 있습니다. 구문은 (우연히는 아니지만) trsed예제 와 매우 유사합니다 .

perl -pe 'tr/_"/,/d' input.csv > result.csv

또는:

perl -pe 's/_/,/g; s/"//g' input.csv > result.csv

그러나 솔직히,이 기본 작업을 위해 새로운 프로그래밍 언어 (실제로 awk, Perl 및 sed 및 기타 도구)를 배우고 싶지 않다면 바로 할 수 있습니다. 검색 및 바꾸기를 지원하는 모든 텍스트 편집기 :

  1. 좋아하는 텍스트 편집기에서 CSV 파일을여십시오 (예 : gedit, kate, mousepad 등; Windows의 일반 메모장 또는 워드 패드에서도 가능).

  2. 메뉴에서 "검색 및 바꾸기"를 선택하십시오 (별도의 "검색"메뉴가없는 경우 "편집"아래에 있음).

  3. _검색 창과 ,교체 상자에 입력하십시오 .

  4. "모두 바꾸기"를 클릭하십시오.

  5. "검색 상자에서 반복 하고 대체 상자에는 아무것도 반복 하지 마십시오.

  6. 파일을 저장하십시오.

이제 하나가 아닌 100 또는 1000 파일에 대해이 작업을 수행해야하는 경우 새로운 명령 줄 도구를 배우는 것이 합리적입니다. 물론 Perl이나 sed 등을 사용하는 방법을 알고 나면 나중에 비슷한 작업으로 많은 시간과 노력을 절약 할 수 있습니다. 그러나 다시 할 필요가없는 일회성 작업의 경우 텍스트 편집기와 같은 기본 대화식 도구가 가장 간단한 솔루션 인 경우가 있습니다.


3

당신도 이것으로 할 수 vim있습니다.

파일을 연 vim input.csv다음 vim고급 검색 도구를 사용하십시오 s. 콜론 ( :)을 입력 하여 명령 모드로 들어가서 다음과 같이 명령을 실행하십시오.

:%s's/_/,/g'  -- Replaces all occurrences of _ with , in the current file.
:s/\"//g -- Replaces all occurrences of " with nothing in the current file.

IanC의 답변과 거의 동일한 명령이지만 vim을 사용 하는 대신 내부 명령 sed입니다.


2

입력 및 출력 분리기 값의 기본값을 변경하지 않는 이유

awk -F "_" 'BEGIN { OFS="," }; {gsub(/\"/,""); print $1,$2,$3,$4,$5}' input.csv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.