정확한 구분 기호 수를 포함하는 줄만 유지하세요.

정확한 구분 기호 수를 포함하는 줄만 유지하세요.

쉼표로 구분된 10개의 필드가 있는 거대한 csv 파일이 있습니다. 불행하게도 일부 행의 형식이 잘못되어 정확히 10개의 쉼표가 포함되어 있지 않습니다(이로 인해 파일을 R로 읽으려고 할 때 몇 가지 문제가 발생합니다). 정확히 10개의 쉼표가 포함된 줄을 필터링하는 방법은 무엇입니까?

답변1

또 다른 POSIX:

awk -F , 'NF == 11' <file

줄에 쉼표가 10개 있으면 줄에는 11개의 필드가 있습니다. 그래서 우리는 단순히 필드 구분자로 awk사용합니다 . ,필드 수가 11개이고 조건 NF == 11이 true이면 awk기본 작업이 수행됩니다 print $0.

답변2

사용 egrep(또는 grep -EPOSIX에서):

egrep "^([^,]*,){10}[^,]*$" file.csv

이는 10개의 쉼표를 포함하지 않는 모든 항목을 필터링합니다. "모든 수의 문자(',' 제외, 뒤에 단일 ','"가 오는) 시퀀스의 10번 반복을 포함하는 전체 줄( ^시작과 $끝)과 {10}일치합니다. ( ) ( ([^,]*,)) 다음에 [^,]*"," ( )를 제외한 모든 문자가 옵니다.

-x이 매개변수를 사용하여 앵커 포인트를 제거 할 수도 있습니다 .

grep -xE "([^,]*,){10}[^,]*" file.csv

이는 다음보다 덜 효율적입니다.쿠엔람내 시스템에서는 10개 정도의 쉼표가 포함된 줄 에 awk대해 후자가 일반적으로 6배 더 빠릅니다. 라인이 길어지면 속도가 크게 저하됩니다.

답변3

가장 간단한 grep코드가 작동합니다.

grep -xE '([^,]*,){10}[^,]*'

설명하다:

-x패턴이 일치해야 하는지 확인하세요.모두라인의 일부가 아닙니다. 쉼표가 10개 이상 포함된 줄을 일치시키지 않는 것이 중요합니다.

-E정규식에서 백슬래시 이스케이프를 줄이는 "확장 정규식"을 나타냅니다.

괄호는 그룹화에 사용되며, 이후는 {10}괄호 안의 패턴이 한 줄에 정확히 10개의 일치 항목이 있어야 함을 의미합니다.

[^,]예를 들어 a , a , an 또는 an 의 단일 문자와 일치하고 [c-f]대문자가 아닌 모든 단일 문자와 일치하는 문자 클래스입니다. 따라서 쉼표를 제외한 모든 단일 문자와 일치합니다.cdef[^A-Z][^,]

*문자 클래스 뒤에 오는 것은 "이 중 0개 이상"을 의미합니다.

따라서 정규식 부분은 ([^,]*,)"쉼표가 뒤따르는 0을 포함하여 여러 번 발생하는 쉼표 이외의 문자"를 의미하며 {10}이러한 문자 10개가 지정됩니다. 그런 다음 [^,]*쉼표가 아닌 나머지 문자를 줄 끝까지 일치시킵니다.

답변4

몇 가지 짧은 내용을 입력하세요 python.

#!/usr/bin/env python2
with open('file.csv') as f:
    print '\n'.join(line for line in f if line.count(',') == 10)

그러면 각 줄을 읽고 줄의 쉼표 수가 10인지 확인한 다음 line.count(',') == 10, 그렇다면 줄을 인쇄합니다.

관련 정보