删除文件 A 中包含文件 B 中字符串的所有行

dot*_*hen 16 linux command-line text-processing

我有一个users.csv包含用户名、用户 ID 和其他数据列表的CSV 文件:

username, userid, sidebar_side, sidebar_colour
"John Lennon", 90123412, "left", "blue"
"Paul McCartny", 30923833, "left", "black"
"Ringo Starr", 77392318, "right", "blue"
"George Harrison", 72349482, "left", "green"
Run Code Online (Sandbox Code Playgroud)

在另一个文件中,toremove.txt我有一个用户 ID 列表:

30923833
77392318
Run Code Online (Sandbox Code Playgroud)

有没有一种聪明、有效的方法来从users.csv文件中删除包含 ID 的所有行toremove.txt?我编写了一个简单的 Python 应用程序来解析这两个文件,并只将那些在toremove.txt. 也许一些sedawk魔法可以帮助这里?

考虑到上述示例,这是预期的结果:

username, userid, sidebar_side, sidebar_colour
"John Lennon", 90123412, "left", "blue"
"George Harrison", 72349482, "left", "green"
Run Code Online (Sandbox Code Playgroud)

cuo*_*glm 17

使用grep,您可以执行以下操作:

$ grep -vwF -f toremove.txt users.txt 
username, userid, sidebar_side, sidebar_colour
"John Lennon", 90123412, "left", "blue"
"George Harrison", 72349482, "left", "green"
Run Code Online (Sandbox Code Playgroud)

awk

$ awk -F'[ ,]' 'FNR==NR{a[$1];next} !($4 in a)' toremove.txt users.txt 
username, userid, sidebar_side, sidebar_colour
"John Lennon", 90123412, "left", "blue"
"George Harrison", 72349482, "left", "green"
Run Code Online (Sandbox Code Playgroud)