次の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
シーケンスをテスト,
してください。その後、一致する場合にのみリントを実行してください。[^,]+
,abc
p
答え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
csvgrep
2番目の列は、文字列で始まるすべてのレコードを抽出するために使用されます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