2つのファイルをGrepし、複数のヒットを含む行を印刷します。

2つのファイルをGrepし、複数のヒットを含む行を印刷します。

2つのファイルがあります。

  • file1.txt
    abc
    def
    ghi
    jkl
    mno
    pqr
    
  • file2.txt
    abc ghi
    abc xyz
    xyz xyz
    mno jkl
    def stu
    

(列区切り記号はタブです)

私はfile1.txt次のようにgrepしようとしています。file2.txt

grep -w -f file1.txt file2.txt

次の結果が表示されます。

abc     ghi
abc     xyz
mno     jkl
def     stu

しかし、私が望むのは出力です両方以下のように、列1と列2file2.txtに照会があります。file1.txt

abc     ghi
mno     jkl

どんな助けでも歓迎します。

ありがとうございます。

クマ

答え1

各値をfile1.txt配列に保存しますa。次に、file2.txt最初のフィールドと2番目のフィールドの両方を含む行を解析して印刷しますa

awk 'NR==FNR{a[$0];next}$1 in a && $2 in a' file1.txt file2.txt

のフィールド数に関係なく、file2.txtすべてのフィールドを繰り返して検査を実行します。フィールドのいずれかがにない場合は次の行にa進み、そうでない場合はその行を印刷します。

awk 'NR==FNR{a[$0];next}{for(i=1;i<=NF;i++){if(!($i in a)){next}}print}' file1.txt file2.txt

答え2

pbmを使用すると、要素を含むpython親セットを作成してpbmにアクセスできます。bfile1.txt

次に、読み出した各行について、file2.txt現在の行で形成されたセットが親セットbのサブセットであることを確認する。この場合、file2.txtの現在の行を印刷します。

$ python3 -c 'import sys
f1, f2 = sys.argv[1:]
with open(f1) as fh1, open(f2) as fh2:
  b = set([l.strip() for l in fh1])
  print(*(l.rstrip() for l in fh2 if set(l.strip().split()).issubset(b)), sep="\n")
' file1.txt file2.txt

abc ghi
mno jkl
$ perl -lane '$. == 1 and 
    %h = map { /(.*)(\n)/ } <STDIN>;
    print if ! grep { ! $h{$_} } @F;
' file2.txt < file1.txt

sedを使用してfile1.txtを予約済みスペースに保存し、File2.txtから読み取られた各行について、現在の行のすべての要素の存在を比較し、すべての要素が見つかった場合に印刷します。

$ sed -Ee '
    /\n/{h;d;}
    /\s/!{H;d;}
    G;h
    s/\n.*//;s/\n//;x
    :a
      s/^\s?(\S+)((\s\S+)?\n.*\n\1(\n|$))/\2/
    ta
    s/^\n//;tb
    D;:b;x
' file1.txt file2.txt
while IFS= read -r l <&3; do
  read -r a b <<<"$l"
  grep -qFe "$a" file1.txt &&
  grep -qFe "$b" file1.txt &&
  printf '<%s>\n' "$l"
done 3< file2.txt

関連情報