Linux 使用awk sed命令和while循环从第二个文件中删除条目
我有两个输出文件:Linux 使用awk sed命令和while循环从第二个文件中删除条目,linux,bash,awk,sed,while-loop,regex,Linux,Bash,Awk,Sed,While Loop,Regex,我有两个输出文件: 文件A包含70000多个唯一条目 FILE-B包含我需要从FILE-B中删除的唯一列表 文件A: 文件B内容: TOM ELI 我想从文件A中删除文件B中列出的任何内容 文件C(结果文件): 我假设我需要一个,而r代表I语句。有人能帮我吗? 我需要cat并读取文件-A,对于文件-B中的每一行,我需要将其从文件-A中删除 我应该使用什么命令?您可以使用grep-v-f: grep -xFvf FILE-B FILE-A ACK AILEY BORG ROSE 您不需要a
TOM
ELI
我想从文件A中删除文件B中列出的任何内容
文件C(结果文件):
我假设我需要一个,而r代表I
语句。有人能帮我吗?
我需要cat
并读取文件-A,对于文件-B中的每一行,我需要将其从文件-A中删除
我应该使用什么命令?您可以使用
grep-v-f
:
grep -xFvf FILE-B FILE-A
ACK
AILEY
BORG
ROSE
您不需要
awk
、sed
或循环。您只需要grep
:
fgrep -vxf FILE-B FILE-A
请注意使用-x
来精确匹配条目
输出:
JACK
AILEY
BORG
ROSE
如果从排序输入开始,此任务的工具是
comm
comm -23 FILE-A FILE-B
选项参数意味着
-2 suppress lines unique to FILE-B
-3 suppress lines that appear in both files
如果最初没有排序,可以执行以下操作
comm -23 <(sort FILE-A) <(sort FILE-B)
comm-23您不需要任何循环,单个awk
或sed
命令就足够了:
awk:
sed:
注:
虽然sed版本适用于显示的数据,但它不会处理FILE-B中任何可以解释为regex模式的文本
awk解决方案将文件B完全读取到内存中。它没有像sed
解决方案那样解释文本的限制
您想要两个文件之间的唯一行集吗?请参见(搜索“抑制重复行”)。这是一个单线awk解决方案。此外,这个Q最好的网站是。Shell编程的东西很容易在SO上的混乱中丢失。您可能还希望-F
将FILE-B中的行解释为固定字符串,而不是正则表达式。@PeterCordesfgrep
总是将模式解释为普通字符串,而不是正则表达式。它与grep-F
完全相同。不推荐使用fgrep
调用。有关详细信息,请参见man grep
。真的吗?嗯,我的*BSD机器似乎都没有收到那个备忘录。:)说真的,fgrep
已经使用了40多年,你真的认为它会因为GNU的某个人希望它这样做而消失吗?它不会反过来工作grep-F
在任何地方都可用,而且在任何地方都不推荐使用。所有系统都有grep-F
,并且将持续很长时间,但是fgrep
,没有grep-F
显然是最安全的选择。awk
解决方案将FILE-B
完全读取在内存中。sed
解决方案假设一个sed
可以从stdin
读取脚本(即,只有GNUsed
,AFAIK)。只需注意:尽管sed
版本适用于显示的数据,它不会处理文件B中任何可以解释为正则表达式模式的文本,awk
版本可以解决这样的问题。@Peter.O我想知道谁会首先注意到这一点。这是sed
解决方案的一个有效且严重的陷阱。不过,可以通过对文件B进行消毒来克服这一问题。不管怎样,我加了你的便条。thnks@SatoKatsura我也加了你的便条。thnks
-2 suppress lines unique to FILE-B
-3 suppress lines that appear in both files
comm -23 <(sort FILE-A) <(sort FILE-B)
awk 'FNR==NR {a[$0];next} !($0 in a)' FILE-B FILE-A >FILE-C
sed "s=^=/^=;s=$=$/d=" FILE-B | sed -f- FILE-A >FILE-C