質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
grep

grepはコマンドライン上でテキスト検索を可能にするユーティリティーです。元はUnixのために用意されたものです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

2回答

1115閲覧

ファイル1のキーワードに合致するものをファイル2で探し、その紐づく情報を抽出したい。

minitaso

総合スコア1

grep

grepはコマンドライン上でテキスト検索を可能にするユーティリティーです。元はUnixのために用意されたものです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2020/06/21 08:20

前提・実現したいこと

data.list に各種製品の評価と点数の情報が以下の通り入っています(製品名は仮で作成しています)。今回、発注された製品の情報(key.list)をもとに、それらの評価と点数の情報を data.list から取り出したいと考えております。実現したい形は以下の通りです。grep -x -i -f による共通行の抽出では完全一致になってしまうため、処理が進まず、どのようにすべきか悩んでおります。

[key.list]
camera
tv
camera2
pc
pc2
pc3
camera3
camera4

[data.list(製品名の横にタブ区切りで評価と点数データがリスト化)]
ZXXXX good 90
JJLLAE bad 40
JCKJFWE good 86
camera bad 30
tv good 90
cdnajkK bad 30
camera2 good 87
pc2 good 90
ewjknwk bad 30
canjkefnwjke good 90
pc3 good 89
camera3 good 90
pc bad 20
camera4 good 100

[最終的に出力したいoutput.list]
camera bad 30
tv good 90
camera2 good 87
pc2 good 90
pc3 good 89
camera3 good 90
pc bad 20
camera4 good 100

該当のソースコード

grep -x -i -f key.list data.list > output.list

試したこと

grep のオプションの確認など。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

-xは、「行全体が一致」なので、それを外せば出来ます。
が、部分一致なので、「単語単位の一致」である-wを付けるのが良いかと思います。

投稿2020/06/21 08:29

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minitaso

2020/06/21 09:01

ありがとうございます。grep -w -i -f key.list data.list > output.list でやってみたところ、「camera4 good 100」となり、最後のkey の情報だけが出てきました。他を残すには別のオプション(か構文?)が必要でしょうか?知識不足で申し訳ございません。
otn

2020/06/21 10:35

そのコマンドで正しいです。 空白とかタブとかそのあたり見えない文字が意図通りではないのでは?
minitaso

2020/06/22 13:03

windows で作成したファイルで練習していたので、改行コードが影響していたのだと思います。mac でファイルを作成したところ、結果がコメントいただいたとおりに出ました(度々のご質問となり失礼しました)。ベストアンサーとさせていただきます。
minitaso

2020/06/23 09:54

otn 様、解決後のご質問となり申し訳ありませんが、今回のような場合、key.list で示した順番と通りに出力する場合は、grep のオプションなどではやはり対応できないでしょうか?(現状のoutput.list では、key.list とは順番が異なってしまいます)
otn

2020/06/23 11:42

grep 一発では無理です。 key.listの行毎にgrepを何回も実行することになります。
minitaso

2020/06/23 11:47

早々にコメントありがとうございます。承知しました。他の方法なども考えたいと思います。
guest

0

key.list で仮に camera2 がない場合でも camera が有るために camera2 もhitしてしまうのが問題 ということでしょうか?

もしそうでしたら -x option はなしにして、
1) key.list を修正し <camera> の様に前後に <>をつける
2) そこを触りたくないのなら
sed -e 's/^/\</' -e 's/$/\>/' key.list |grep -if - data.list

投稿2020/06/21 08:40

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minitaso

2020/06/21 09:49

素人質問にもかかわらず、コメントをありがとうございます。教えていただいたsedコマンドをもとに(-if は -i -f でしょうか?)、sed -e 's/^/\</' -e 's/$/\>/' key.list | grep -i -f data.list > output.list としましたが、結果には何も出力されない状況です。何か認識違いでしたら、申し訳ありません。私のイメージに近い質問が以下にもありまして、while 文だけで回すことができれば、解決する可能性があるとも思いました。 https://teratail.com/questions/143994
winterboum

2020/06/21 09:52

-i -f と -if は同じです。 で、-f のあとに - が有るのを見落としてませんか?
winterboum

2020/06/21 09:54

で、私の解より otn さんのほうが正道だとおもうのですが。 私のところで試したところ全部でました。
minitaso

2020/06/21 10:01

- を付けますと、grep: -: No such file or directory と出てきます。また、otn様のコメントを試したところでは、camera4 good 100 のみが出てきます。data.list の情報がダブ区切りになっているからでしょうか、、度々申し訳ありません。
winterboum

2020/06/21 11:14

sed -e 's/^/\</' -e 's/$/\>/' key.list |grep -if - data.list ですよ grep -if - data.list ではないです
minitaso

2020/06/22 13:05

otn さんのご返事で回答しましたが、windows で作成したファイルを使っていたことが影響していたと思います。無事にできました。度々コメントいただき、本当にありがとうございました&そしてお手数をお掛けしました。otn さんのコマンドが王道とお聞きしましたのでベストアンサーとしましたが、winterboum さんのコメントも勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問