2016-06-09 2 views
0

큰 쉼표로 구분 된 20000 행 5 열의 파일이 있는데, 특정 열을 추출하고 싶습니다. 그러나 더 많은 쉼표가 있으므로 헤더를 제외하고 더 커야합니다 기둥.CSV 파일의 첫 번째, 마지막 두 번째 필드와 마지막 필드 인쇄

예제 파일 :

name,v1,v2,v3,v4,v5 
as,"10,12,15",21,"12,11,10,12",5,7 
bs,"11,15,16",24,"19,15,18,23",9,3 

이 내 원하는 출력된다

name,v4,v5 
as,5,7 
bs,9,3 

내가 잘라 내기 명령 다음하지만 시도는이 시나리오에 대한 일반적

cut -d, -f1,5,6 
+0

20000은 크지 않습니다. 이미 20 년이 넘었지만, 나는 텍스트 편집기로 그것을 터뜨리는 것에 대해 두 번 생각하지 않았을 것이고 검색을 대체 할 것입니다. – Kaz

+0

내 의견으로는 파일 이름과 v1에서 v5까지 6 개의 필드가 있습니다. – Kaz

답변

1

을 작동하지 않습니다 적절한 csv 파서를 사용하는 것이 가장 좋습니다. 파이썬에서 찾을 수 있습니다. 리스프 TXR에서

$ awk 'BEGIN{FS=OFS=","} {print $1, $(NF-1), $NF}' file 
name,v4,v5 
as,5,7 
bs,9,3 
+0

감사합니다 fedorqui,하지만 만약 내가 센터 collum (즉, 3)을 자르고 싶다면, 무엇? – mona

+0

@mona 그러면 bash 스크립팅이 좋은 방식으로 처리 할 수 ​​없기 때문에 CSV 파서를 사용해야합니다. – fedorqui

0

: 데이터는 단지 처음에 쉼표로 필드를 갖고있는 것 같아요 때문에

그러나, 당신은 첫 번째 필드 다음 끝에서 두 번째와 마지막 하나를 인쇄하도록 결정할 수 있습니다

extract.tl에서
$ txr extract.tl < data 
name,v4,v5 
as,5,7 
bs,9,3

코드 :

(mapdo 
    (lambda (line) 
    (let ((f (tok-str line #/"[^"]*"|[^,]+/))) 
     (put-line `@[f 0],@[f 4],@[f 5]`))) 
    (get-lines)) 

응축 한 라이너로 :

$ txr -t '(mapcar* (do let ((f (tok-str @1 #/"[^"]*"|[^,]+/))) 
        `@[f 0],@[f 4],@[f 5]`) (get-lines))' < data
관련 문제