Text-Processing

grep 兩個文件並列印多個命中的行

  • September 25, 2020

我有兩個文件。

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

(列分隔符是製表符)

我正在嘗試像這樣file1.txt反對:file2.txt

grep -w -f file1.txt file2.txt

我得到以下輸出:

abc     ghi
abc     xyz
mno     jkl
def     stu

但是,我想要的是第1 列和第 2 列file2.txt命中的輸出file1.txt,如下所示:

abc     ghi
mno     jkl

歡迎任何幫助。

謝謝。

將 的每個值保存file1.txt在一個數組a中。然後,解析file2.txt並列印在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

使用python我們可以通過創建一個b包含file1.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

引用自:https://unix.stackexchange.com/questions/610932