正規表現を使用してCSVファイルからデータを抽出する

正規表現を使用してCSVファイルからデータを抽出する

次のCSVファイルがあります。

1004051,[email protected],abc,eaf
1004052,[email protected],edf,eaf
1004053,[email protected],abc,eaf
1004054,[email protected],ghi,eaf

2番目のフィールドが文字列で始まる行だけを抽出したいと思いますabc_

1004051,[email protected],abc,eaf
1004053,[email protected],abc,eaf

答え1

,もう一度、これが最初のフィールドにsを含めないように解析する必要がないと仮定すると、sed次のこともできます。

sed -nE "/[^,]+,abc/p" file

1004051,[email protected],abc,eaf
1004053,[email protected],abc,eaf

-nすべての行を印刷するのではなく、拡張正規表現を使用して、後に含まれていないEシーケンスをテスト,してください。その後、一致する場合にのみリントを実行してください。[^,]+,abcp

答え2

$ awk -F, '$2 ~ /^abc_/' file.csv
1004051,[email protected],abc,eaf
1004053,[email protected],abc,eaf

これは、awkフィールド区切り文字としてコンマを使用します。 2番目のフィールド($2)がtextで始まるかどうかをテストしますabc_。これは正規表現で行われます^abc_。テストが成功すると、現在の行が印刷されます。


入力ファイルが「単純CSV」ファイルではなく、カンマと改行を含む引用符付きフィールドを含むCSVファイルの場合は、CSVパーサーを使用する必要があります。たとえば、次のようにcsvgrep使用できます。csvkitツールキット:

$ csvgrep -H -c 2 -r '^abc_' file.csv
a,b,c,d
1004051,[email protected],abc,eaf
1004053,[email protected],abc,eaf

csvgrep2番目の列は、文字列で始まるすべてのレコードを抽出するために使用されますabc_。出力の最初の行は、csvgrep入力ファイルにヘッダー行が含まれていないために生成されるヘッダー行です。これを望まない場合は、結果を渡して削除してくださいsed 1d

$ csvgrep -H -c 2 -r '^abc_' file.csv | sed 1d
1004051,[email protected],abc,eaf
1004053,[email protected],abc,eaf

また、見ることができますcsvgrep --help

答え3

Python

#!/usr/bin/python
import re
d=re.compile(r'abc')
l=open('filename','r')
for m in l:
    k=m.split(",")
    if re.search(d,k[1]):
        print m.strip()

出力

1004051,[email protected],abc,eaf
1004053,[email protected],abc,eaf

関連情報