web-dev-qa-db-ja.com

2つのファイルを比較して一致を印刷する

とにかくこれをUnix Shellスクリプトで取得する方法はありますか? 1列(1000行)のfileAと26列(13000行)のfileBがあります。
fileAの各値をfileBで検索し、一致する場合はFileBから26個の値をすべて返す必要があります。 (FileAからの)検索値は、FileBの26個の値のいずれかに存在する可能性があります。この値は、Bファイルのどの列でも固定されていません。

FILEA:

abc
def
ghi

FILEB:

drm|fdm|pln|ess|abc|zeh|....|yer (26 values)
fdm|drm|def|ess|yer|zeh|....|pln

ここで、fileAのabcは5番目の列です。 FileBの場合-結果はFileBからの26の値すべてになるはずです。
同様に、fileAのdefは3番目の列です。 FileBの-それで私の結果はFileBからの26の値すべてになるはずです。

このように、レコードセット全体に対して行う必要があります。

一致しない場合、レコードを無視します。

6
vamshi

grepを使用するだけです。

grep -Fwf fileA fileB

man grepから:

   -F, --fixed-strings
          Interpret PATTERN as a  list  of  fixed  strings,  separated  by
          newlines,  any  of  which is to be matched.  (-F is specified by
          POSIX.)
   -f FILE, --file=FILE
          Obtain  patterns  from  FILE,  one  per  line.   The  empty file
          contains zero patterns, and therefore matches nothing.   (-f  is
          specified by POSIX.)
   -w, --Word-regexp
          Select  only  those  lines  containing  matches  that form whole
          words.  The test is that the matching substring must  either  be
          at  the  beginning  of  the  line,  or  preceded  by  a non-Word
          constituent character.  Similarly, it must be either at the  end
          of  the  line  or  followed by a non-Word constituent character.
          Word-constituent  characters  are  letters,  digits,   and   the
          underscore.
12
terdon

FileAの順序は重要ですか?そのパターンでfileBに複数の行を含めることができますか?これにより、たとえばfileAが解析され、fileBの各パターンが検索されます。

while read i; do grep "$i" fileB; done < fileA

しかし、より高いパフォーマンスのソリューションを得るには、問題をより明確に定義する必要があります。たとえば、行全体を取得するだけで十分です。26の値として表示する必要はありません。

3
user84504