在 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 中。需要注意的是,如果这两个文件中的行都是唯一的,则所有这些命令效果最佳,如果文件包含重复行,则最终可能会删除您希望保留在输出文件中的行。