CSV 파일에 열을 삭제하는 명령 줄 철자가 있습니까?


32

다음 내용의 파일이있는 경우 :

1111,2222,3333,4444
aaaa,bbbb,cccc,dddd

원본과 같지만 n = 2와 같은 n 번째 열이없는 파일을 얻으려고합니다 (또는 3 일 수 있습니다)

1111,2222,4444
aaaa,bbbb,dddd

또는 n = 0 인 경우 (또는 1 일 수 있음)

2222,3333,4444
bbbb,cccc,dddd

실제 파일은 수만 개의 열이있는 기가 바이트 길이 일 수 있습니다.

그런 경우와 마찬가지로 커맨드 라인 마술사가 우아한 솔루션을 제공 할 수 있다고 생각합니다 ... :-)

실제 실제 경우에는 첫 번째 열을 시퀀스에서 두 번 삭제하여 수행 할 수있는 첫 번째 열 2 개를 삭제해야하지만 비트를 일반화하는 것이 더 재미있을 것이라고 생각합니다.


필드에 포함되지 ,않습니까? (즉, ,필드 구분자로만 사용됩니다.)
CVn

@ MichaelKjörling,보다 유연한 솔루션을 사용하는 것이 좋지만 제 경우에는 예입니다. 예 : 구분 기호는 ,필드 내부에서 절대 발생하지 않습니다.
Ivan

이 경우 Scott의 대답은 그저 문제가되지 않습니다.
CVn

답변:


47

나는 이것이 GNU coreutils에서 잘라낸 것이라고 생각합니다.

$ cut --complement -f 3 -d, inputfile
1111,2222,4444
aaaa,bbbb,dddd

일반적으로 -f를 통해 원하는 필드를 지정하지만 --complement를 추가하면 의미를 자연스럽게 바꿀 수 있습니다. '남자 컷'에서 :

--complement
    complement the set of selected bytes, characters or fields

한 가지주의 사항 : 열에 쉼표가 포함되어 있으면 cut은 스프레드 시트와 같은 방식으로 CSV 파서가 아니기 때문에 잘립니다. 많은 파서는 CSV에서 이스케이프 쉼표를 처리하는 방법에 대해 다른 아이디어를 가지고 있습니다. 간단한 CSV 사례의 경우 명령 행에서 잘라내 기가 여전히 진행됩니다.


4
간단한 CSV 파일이라면 제대로 작동합니다. 열 중 하나라도 쉼표가 포함 된 문자열 인 cut경우 CSV 파서가 아니기 때문에 제외됩니다. CSV 필드의 값에 필드 구분 기호가 있으면 따옴표로 묶습니다. BTW의 주제에 cut, -f필드의 범위를합니다. cut -f, -d3-세 번째 필드를 출력하여 처음 두 필드를 제거합니다.
Alexios

2
당신은 의미cut -d, -f3-
쓸모없는

@Alexios 좋은 지적입니다. "실제"CSV를 다루지 않고 단순한 하위 집합 만 처리합니다. 이를 반영하여 답변을 편집하겠습니다.
Scott McClung

@ 쓸모없는 : 젠장. 그것이 내가 다시 '컷 난독증'이라고 부르는 것입니다. 한숨 . Scott : CSV 파일은 까다로운 짐승입니다. 너무 많은 다른 하위 형식이 있는데, 그 중 일부는 심지어 C SV는 아니지만 어쨌든 그것을 일반적으로 불립니다.
Alexios

그러면 터미널에 새 CSV가 인쇄됩니다. 입력을 덮어 쓰려면 어떻게해야합니까 (또는 새 파일에 쓰거나 OP가 찾고있는 것 같습니다)?
Max Ghenis

12

데이터가 단순히 쉼표로 구분 된 열로 구성된 경우 :

cut -d , -f 1-2,4-

awk를 사용할 수도 있지만 필드를 지우는 것이 쉽지만 구분 기호를 제거하면 약간의 작업이 필요하기 때문에 약간 어색합니다. 빈 필드가 없으면 나쁘지 않습니다.

awk -F , 'BEGIN {OFS=FS}  {$3=""; sub(",,", ","); print}'

따옴표가 올바르게 인용 된 경우 필드 안에 쉼표가 나타날 수있는 실제 CSV 가있는 경우 실제 CSV 라이브러리 가 필요합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.