比较两个文件并打印空行以查找不匹配的文件?

比较两个文件并打印空行以查找不匹配的文件?

我正在尝试匹配两个文件并打印匹配结果,并根据“数字”列 3 为不匹配结果保留空行。此处的想法是使两个文件长度相同。

示例:文件 1

BMW 111  N1
BENZ 123 N2
TOYOTA 122 N3 

文件2

N1
N23
N3 

结果:

BMW 111 N1
*blank line (N23 does not exit in file 1*
TOYOTA 122 N3 

我使用 AWK 来匹配这两个文件,但无法插入空行

awk 'NR==FNR{a[$1];next}$3 in a{print $1,$2,$3}' file2.txt file1.txt > result.txt 

https://stackoverflow.com/questions/977408/how-do-i-insert-a-blank-line-every-n-lines-using-awk

答案1

而不是$3 in a{print $1,$2,$3},尝试!($3 in a){$0 = ""} 1

答案2

for line in $(cat file2); 
do
   grep $line file1 || echo ""; 
done

产生以下输出

$ for line in $(cat file2); do   grep $line file1 || echo ""; done
BMW 111  N1

TOYOTA 122 N3
$

答案3

假设两个文件都在连接字段上排序:

$ join -1 3 -a 2 -o1.1,1.3,1.3 file1 file2
BMW N1 N1

TOYOTA N3 N3

file1这使用(with -1 3) 的第三列和 的第一列(也是唯一列)对两个文件执行关系 JOIN 操作file2。我们要求file2输出中包含 的所有行(带有-a 2),甚至是未配对的行。对于输出,我们要求打印第一个文件的所有三个字段(带有标志-o)。不匹配行上的空字段将保持为空,但可以添加-e something字符串 来填充它们something

如果两个文件是不是在连接字段上排序,您可以使用对它们进行预排序

sort -k3 -o file1 file1
sort -o file2 file2

或者,如果您的 shell 支持进程替换,您可以在连接的同时进行排序,使用

join -1 3 -a 2 -o1.1,1.3,1.3 \
    <( sort -k3 file1 ) \
    <( sort file2 )

答案4

  paste file1.txt file2.txt | sed -Ee 's/\s(\S+)\s+\1\s*$/ \1/;t'  -e g

这将每行并排打印文件的内容,然后我们让 Gnu sed 在此行上进行操作。

如果文件的最后一个字段匹配,我们将从该行中删除它并打印它。否则,我们打印一个空行,从空的保存空间中检索。

另一种方式可能是:

paste a.txt b.txt | awk '{NF -= $(NF) == $(NF-1) ? 1 : NF}1'

相关内容