1

我想要一个 shell 脚本来搜索两个文件并返回一个字符串列表:

文件 A 仅包含一个唯一的字母数字字符串列表,每行一个,如下所示:

accc_34343
GH_HF_223232
cwww_34343
jej_222

文件 B 包含其中一些字符串的列表(有时不止一次),以及第二列信息,如下所示:

accc_34343 dog
accc_34343 cat
jej_222 cat
jej_222 horse

我想创建第三个文件,其中包含文件 A 中不在文件 B 中的字符串列表。

我试过用 grep -v 使用一些循环,但这不起作用。因此,在上面的示例中,新文件的内容如下:

GH_HF_223232
cwww_34343

任何帮助是极大的赞赏!

4

3 回答 3

2

以下是您可以执行的操作:

grep -v -f <(awk '{print $1}' file_b) file_a > file_c

解释:

  • grep -v:使用-v选项grep来反转匹配
  • -f:使用-f选项来grep指定模式来自文件
  • <(awk '{print $1}' file_b):这是在不使用临时文件的情况下<(awk '{print $1}' file_b)简单地提取第一列值;语法是file_b进程替换<( ... )
  • file_a: 告诉grep要搜索的文件是file_a
  • > file_c:要写入的输出file_c
于 2013-01-04T22:15:32.203 回答
1

comm用于查找文件之间的交叉点和差异:

comm -23 <(sort fileA) <(cut -d' ' -f1 fileB | sort -u)

结果:

GH_HF_223232
cwww_34343

我假设你的外壳是 bash/zsh/ksh

于 2013-01-05T00:40:08.240 回答
0
awk 'FNR==NR{a[$0];next}!($1 in a)' fileA fileB

在这里检查

于 2013-01-05T15:27:48.587 回答