CSV 파일에 열을 삭제하는 명령 줄 철자가 있습니까? 수 있음) 2222,3333,4444 bbbb,cccc,dddd 실제

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

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 개를 삭제해야하지만 비트를 일반화하는 것이 더 재미있을 것이라고 생각합니다.



답변

나는 이것이 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 사례의 경우 명령 행에서 잘라내 기가 여전히 진행됩니다.


답변

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

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

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

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

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