grep

grep

複数のファイルを含むフォルダがあり、各ファイルから1)事前に指定された単語のリストから項目を含むすべての行を抽出する必要があります。 2) 行の前にファイル名を追加します。 3)抽出された行を2つに分割します。文字列間の一部の内容を削除します。

抽出するファイルの内容は次のとおりです。

freq +fchi +t*CHI +s"m|v"
Fri Feb 24 10:24:17 2017
freq (08-Jan-2016) is conducting analyses on:
  ONLY speaker main tiers matching: *CHI;
    and those speakers' ONLY dependent tiers matching: %MOR;
****************************************
From file <sarah004.cha>
Speaker: *CHI:
  2 v|eye-3S
  1 v|get
  2 v|get&PAST
  1 v|go&PAST
  1 v|help
  2 v|ride
  3 v|see
  1 v|toe-3S
------------------------------
    8  Total number of different item types used
   13  Total number of items (tokens)
0.615  Type/Token ratio

私が探している単語リストの例はsee | know | lookです(実際のリストははるかに長く、約25単語)。

私が望む最終結果は次のとおりです。

sarah004.cha    3    see
sarah006.cha    3    know
sarah010.cha    1    look
sarah010.cha    2    see
...

したがって、指定された単語を含む行を抽出するだけでなく、数字と単語を分離してv|も削除します。

ディレクトリ内の一部のファイルにはリスト内の単語が含まれていない場合や、他のファイルにはリスト内の単語が多数含まれている場合があります。

sedを使用してこれを実行できるかどうかはわかりません。これを開始点として試しましたが(カウントのある行の抽出)、実行は完了しません。

sed '/From file/{s/.*<\(.*\)>/\1/;h
}
/^  [0-9] v|/!d
s/.*= //;H;x' ./* | paste - - > sarahverbcounts.txt

いくつかのステップでこれを行うことができますが、1つのコマンド/スクリプトで実行できると確信していますが、方法はわかりません。私はPerlがこれを処理できると思いますが、構文がわかりません(私は見つけたPerlの例を試しましたが、私の目的に合わせて正しく変更する方法がわかりませんでした)。単語リストを指定できるようにPythonでこれを試す必要があるかもしれませんが、Pythonにディレクトリ内のすべてのファイルを1つずつ繰り返してすべて同じものを作成するように指示する方法に慣れていません。出力ファイル(いくつかの例を見ましたが、よくわかりません。)どんな提案でも感謝します。可能であれば、ソリューションがどのように機能するかについての説明が良いでしょう。なぜなら、私はこの分野に慣れておらず、私が提供した有用な答えをいつも解析できないからです。

ベストアンサー1

検索したい単語のリストを名前付きファイルに入れて、words.txt次のコマンドを実行します。

grep -Hf words.txt files.* | sed 's/:/ /;s/v|/ /'

おすすめ記事