grep でフィルタリングして行の先頭のみを表示する

grep でフィルタリングして行の先頭のみを表示する

(MacOSX を使用しており、これを Perl スクリプトに変換する可能性があります)。私は Linux/Unix コマンドについてはあまり詳しくなく、Google 検索では見つかりませんでした。

誰かのトレーニング記録をすばやく検索するためのスクリプトを作成しています。これを行う方法は、個人のトレーニング記録を 1 行にリストすることです (もっと良い方法があるかもしれません)。Grep を使用して特定の名前、トレーニングを受けた職位、または日付を検索すると、行全体が表示されます。特定の文字列を grep 検索して、行の先頭のみ (つまり、最初の 2 つの単語 (名 / 姓)) を表示したいと考えています。

Training.txt ファイルは次のようになります。

アイヴィー、ショーン レジ係 2016年5月24日 倉庫 2016年12月2日 サービスデスク 2016年11月31日

アレン、アダム キャッシャー 2016年5月10日 倉庫 2016年12月13日

マルティネス、ジェシカ レジ係 2017年5月20日 倉庫 2016年10月29日 監督者 2016年1月23日

私が今使っているコマンドは以下のとおりです。 grep "Cashier" Training.txt

3 つのレコードすべて、つまりすべてのレコードの行全体の内容を返します。

私はもう試した: grep -E -o ".{0,0}Cashier.{0,5}" Training.txt

これによって (この例では 3 つのレコードすべて) が返されますが、「Cashier」の前には 0 文字、後には 5 文字が表示されます。

Cashier 5/10

grep (または Perl コマンド) を組み込んで、たとえば「Supervisor」を検索し、最初の 2 つの単語 (名前) のみを表示するにはどうすればよいでしょうか。二次的な質問: この種のプロセスを簡単にするアイデアはありますか。(この場合、スプレッドシートは役に立ちません)。

答え1

これは次の場合に最適ですawk:

awk '/Supervisor/ { print $1, $2 }' /path/to/inputfile

「Supervisor Bob」という名前の人物が誤って検出されないように、検索を 3 番目のフィールドに制限することもできます。

awk '$3 ~ /Supervisor/ { print $1, $2 }' /path/to/inputfile

答え2

grepモードをオンにして使用できますPerl:

grep -oP '^(\S+,?\s+){2}(?=Cashier\s)'

結果

Ivie, Shawn
Allen, Adam
Martinez, Jessica

働く

  • Perl モードでは、grep は行の先頭から 2 つのフィールド (\S+) を検索します。
  • そして、2 番目のフィールドの空白の最後に、Cashier の後に空白が続くのが確認できれば、一致が見つかります。Cashier 文字列はルックアラウンドであるため、一致には含まれません。

関連情報