Awk 根据文件B中的两列提取文件A中的行

Awk 根据文件B中的两列提取文件A中的行,awk,Awk,我有两个列数相同的文件(以制表符分隔),如下所示 文件A: 12345 Fish Apple 7123 321 Chicken Apple 9912 661 Ant Apple 316 文件B: 321 Duck Orange 9912 12345 Bird Orange 7123 661 Eagle Orange 34 预期产出: Fiile A_e

我有两个列数相同的文件(以制表符分隔),如下所示

文件A:

12345    Fish    Apple    7123  
321      Chicken Apple    9912  
661      Ant     Apple    316 
文件B:

321      Duck    Orange    9912   
12345    Bird    Orange    7123    
661      Eagle   Orange    34
预期产出:

Fiile A_edited    

661    Ant    Apple    316
基于文件B中第1列和第4列的ID,如果这两个值都出现在文件A中行的第1列和第4列中,我想从文件A中删除该行。我尝试使用grep来执行此操作,但这两个列表非常长,每个都大约66Gb,因此一天后仍在运行。除了grep,还有其他更快的方法吗

p/s:列的数量实际上超过了4列,为了简单起见,这里只显示了4列

awk '{print $1 "\t"$4}'B.txt >> B_edited.txt


# Extract the line number in A.txt containing lines where two IDs are present in B_edited.txt
cat B_edited.txt|while read ID1 ID2
do 
    grep -nE "$ID1.*$ID2"  A.txt|cut -c 1 >> LineNumber.txt
done

# Remove duplicates of line numbers 
sort -u LineNumber.txt >> LineNumberUnique.txt

# Output only lines from A.txt where line numbers are not in the list
awk 'FNR == NR { h[$1]; next } !(FNR in h)' LineNumberUnique.txt A.txt >> A_edited.txt
我将非常感谢任何帮助

谢谢,

要用输出覆盖
fileA
,只需添加
>tmp和&mvtmp fileA
或使用
-i inplace
(如果您有GNU awk 4.*)

$ awk '{k=$1FS$4} NR==FNR{keys[k];next} !(k in keys)' fileB fileA
661      Ant     Apple    316