![如何编写一个脚本来打印文件中不包含另一个文件的每一行?(Bash 脚本)](https://linux22.com/image/1024282/%E5%A6%82%E4%BD%95%E7%BC%96%E5%86%99%E4%B8%80%E4%B8%AA%E8%84%9A%E6%9C%AC%E6%9D%A5%E6%89%93%E5%8D%B0%E6%96%87%E4%BB%B6%E4%B8%AD%E4%B8%8D%E5%8C%85%E5%90%AB%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E6%AF%8F%E4%B8%80%E8%A1%8C%EF%BC%9F%EF%BC%88Bash%20%E8%84%9A%E6%9C%AC%EF%BC%89.png)
例如我有2个文本文件:
file1 包括:
a
b
bb
cc
file2 包括:
aa
bc
ab
输出应该是:
$p1.sh file1 file2
bb
cc
$p1.sh file2 file1
aa
bc
ab
我该如何编写这个 Bash 脚本?我写了类似这样的脚本,但是不起作用:
#!/bin/bash
cat "$1" | while read m
do
grep -f -v "$m" "$2"
done | sort -u
任何形式的指导都将不胜感激!我是一名初级程序员,没有编写脚本的经验。谢谢!
答案1
我认为您需要使用 sort 和 comm 命令来完成这项工作。例如:
comm -23 <(sort -u file1.txt) <(sort -u file2.txt) > file3.txt
我将让您自行使用抑制标志 (-1、-2、-3) 来获得所需的结果。我以 -23 为例。
另一个可能更简单的方法是使用 awk,如下所示:
awk 'FNR==NR{lines[$0]=1;next} !($0 in lines)' file1 file2