在 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+ 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.