我正在尝试匹配两个文件并打印匹配结果,并根据“数字”列 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'