目的
特定の文字列を含まない行だけを抽出します。
ポイント
このような時はpythonのin
が便利です。
ある文字列Aに文字列Bが含まれているかどうかは以下の構文で判定できます。
[文字列B] in [文字列A]
戻り値は論理値です。
実例
in
を使って特定の文字列を含まない行だけを抽出します。
例えば、以下の文章から特定のワードを含まない行のみを取得したいとします。
example.txt
机の上にりんごがあります。
机の上にリンゴがあります。
There is an apple on the table.
机の上にばなながあります。
机の上にバナナがあります。
There is a banana on the table.
除外したいワードのリストは以下のものとします。
filter.txt
りんご
apple
バナナ
そのような場合のスクリプトは以下のようになります。
fitrHavingLine.py
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
"""
参照ファイル上のデータを含まない行を出力する。
"""
__author__ = "Kazuki Nakamae <kazukinakamae@gmail.com>"
__version__ = "0.00"
__date__ = "2 Jun 2017"
import sys
def fitrHavingLine(infn,reffn,outfn):
"""
@function fitrHavingLine();
参照ファイル上のデータを含まない行を出力する。
@param {string} infn : 入力ファイル
@param {string} refdir : 参照ファイル
@param {string} outfn : 出力ファイル
"""
inf = open(infn, 'r')
for infline in inf:
isNothing = True
ref = open(reffn, 'r')
# 参照ファイル上の文字列が存在すれば判定をFalseにする
for refline in ref:
if refline.strip() in infline:
isNothing=False
break
ref.close()
if isNothing:
outf = open(outfn, 'a')
outf.write(infline)
outf.close()
inf.close()
if __name__ == '__main__':
argvs = sys.argv
argc = len(argvs)
if (argc != 4): # 引数チェック
print("USAGE : python3 fitrHavingLine.py <INPUT FILE> <REFERENCE FILE> <OUTPUT FILE>")
quit()
fitrHavingLine(argvs[1],argvs[2],argvs[3])
quit()
bash に以下を入力します。
python3 fitrHavingLine.py example.txt filter.txt out.txt
出力は以下の通りになります。
out.txt
机の上にリンゴがあります
机の上にばなながあります
There is a banana on the table.
おわりに
if refline.strip() in infline:
isNothing=False
break
の部分をいじれば逆に特定の文字を含む行や、あるいは特定の行のみを加工することが可能でしょう。
csv ファイルなどで多様な項目が存在するデータを捌く際に便利かもしれません。
以上です。ありがとうございました。