쉼표로 구분된 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 -E
POSIX에서):
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]
대문자가 아닌 모든 단일 문자와 일치하는 문자 클래스입니다. 따라서 쉼표를 제외한 모든 단일 문자와 일치합니다.c
d
e
f
[^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
, 그렇다면 줄을 인쇄합니다.