カンマ区切りの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}
括弧内のパターンが1行に正確に10の一致を持つ必要があることを意味します。
[^,]
たとえば、a、a、an、またはanの単一文字に一致し、[c-f]
大文字以外のすべての単一文字に一致する文字クラスです。したがって、カンマを除くすべての単一文字と一致します。c
d
e
f
[^A-Z]
[^,]
*
文字クラスの後に続くのは、「このうちゼロ以上」を意味します。
したがって、正規表現部分は、([^,]*,)
「カンマが続くゼロを含む複数回発生するコンマ以外の文字」を意味し、{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
、その場合は行を印刷します。