在 Linux 中从另一个文件 A 中移除在文件 B 中出现的所有行


您可以使用 Linux 中的 grep 命令从文件 A 中移除在文件 B 中出现的所有行。

基本语法如下:

grep -v -f fileB.txt fileA.txt > outputFile.txt

此命令使用 -v 选项反转匹配,以便它返回与文件 B 中不匹配的行。-f 选项指定包含要匹配的模式的文件。输出重定向到一个名为 outputFile.txt 的新文件。

或者,您可以使用 sed 命令

sed -i '/$(grep -f fileB.txt fileA.txt)/d' fileA.txt

此命令使用 -i 选项就地编辑文件,/.../d 指定应删除与模式匹配的行。

您还可以使用 awk 命令

awk 'FNR==NR{a[$0];next} !($0 in a)' fileB.txt fileA.txt > outputFile.txt

此命令比较 fileB.txt 和 fileA.txt,并将 fileA.txt 中不存在于 fileB.txt 中的行打印到 outputFile.txt 中。

使用 comm 和 sort 命令

您可以使用 Linux 中的 comm 和 sort 命令从文件 A 中移除在文件 B 中出现的所有行。

首先,您需要对这两个文件进行排序:

sort fileA.txt > fileA_sorted.txt
sort fileB.txt > fileB_sorted.txt

然后,使用 comm 命令比较这两个排序后的文件:

comm -23 fileA_sorted.txt fileB_sorted.txt > outputFile.txt

-23 选项告诉 comm 只打印 file A 中独有的行(在文件 B 中未出现的所有行)。输出重定向到一个名为 outputFile.txt 的新文件。

或者,您也可以使用

comm -13 fileA_sorted.txt fileB_sorted.txt > outputFile.txt

这将只打印出现在文件 A 中但未出现在文件 B 中的行。

需要注意的是,在使用 comm 命令之前,这两个文件都需要进行排序。

使用 join 和 sort 命令

您可以使用 Linux 中的 join 和 sort 命令从文件 A 中移除在文件 B 中出现的所有行。

首先,您需要对这两个文件进行排序:

sort fileA.txt > fileA_sorted.txt
sort fileB.txt > fileB_sorted.txt

然后,使用 join 命令比较这两个排序后的文件:

join -v 1 fileA_sorted.txt fileB_sorted.txt > outputFile.txt

-v 1 选项告诉 join 只打印 file A 中独有的行(在文件 B 中未出现的所有行)。输出重定向到一个名为 outputFile.txt 的新文件。

或者,您也可以使用

join -v 2 fileA_sorted.txt fileB_sorted.txt > outputFile.txt

这将只打印出现在文件 B 中但未出现在文件 A 中的行。

需要注意的是,在使用 join 命令之前,这两个文件都需要进行排序,并且 join 命令需要有一个公共字段,如果文件没有任何公共字段,则需要在使用命令之前添加它。

使用 grep 命令

您可以使用 Linux 中的 grep 命令从文件 A 中移除在文件 B 中出现的所有行。

基本语法如下:

grep -v -f fileB.txt fileA.txt > outputFile.txt

此命令使用 -v 选项反转匹配,以便它返回与文件 B 中不匹配的行。-f 选项指定包含要匹配的模式的文件。输出重定向到一个名为 outputFile.txt 的新文件。

或者,您也可以使用

grep -vxf fileB.txt fileA.txt > outputFile.txt

此命令也使用 -v 选项反转匹配,并使用 -x 选项匹配整行,并使用 -f 选项指定包含要匹配的模式的文件。

需要注意的是,如果这两个文件中的行都是唯一的,则此命令效果最佳,如果文件包含重复行,则最终可能会删除您希望保留在输出文件中的行。

使用 awk 命令

您可以使用 Linux 中的 awk 命令从文件 A 中移除在文件 B 中出现的所有行。

基本语法如下:

awk 'FNR==NR{a[$0];next} !($0 in a)' fileB.txt fileA.txt > outputFile.txt

此命令比较 fileB.txt 和 fileA.txt,并将 fileA.txt 中不存在于 fileB.txt 中的行打印到 outputFile.txt 中。

或者,您也可以使用:

awk 'NR==FNR{a[$0];next} !($0 in a)' fileB.txt fileA.txt > outputFile.txt

此命令也比较 fileB.txt 和 fileA.txt,并将 fileA.txt 中不存在于 fileB.txt 中的行打印到 outputFile.txt 中。

需要注意的是,如果这两个文件中的行都是唯一的,则此命令效果最佳,如果文件包含重复行,则最终可能会删除您希望保留在输出文件中的行。

结论

在 Linux 中,有多种方法可以从文件 A 中移除在文件 B 中出现的所有行,例如使用 grep、comm、join、sed 和 awk 命令。grep 命令使用 -v 选项反转匹配,并使用 -f 选项指定包含要匹配的模式的文件。comm、join 命令要求在使用命令之前对这两个文件进行排序。sed 命令使用 -i 选项就地编辑文件,/.../d 指定应删除与模式匹配的行。awk 命令使用 FNR==NR{a[$0];next} !($0 in a) 或 NR==FNR{a[$0];next} !($0 in a) 比较文件 B 和文件 A,并将文件 A 中不存在于文件 B 中的行打印到 outputFile.txt 中。需要注意的是,如果这两个文件中的行都是唯一的,则所有这些命令效果最佳,如果文件包含重复行,则最终可能会删除您希望保留在输出文件中的行。

更新于:2023年1月24日

6K+ 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告