我想有一个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
非常感谢任何帮助!
答案 0 :(得分: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
中提取第一列值; <( ... )
语法为process substitution。file_a
:告诉grep
要搜索的文件是file_a
> file_c
:输出要写入file_c
答案 1 :(得分:1)
comm
用于查找文件之间的交叉点和差异:
comm -23 <(sort fileA) <(cut -d' ' -f1 fileB | sort -u)
结果:
GH_HF_223232
cwww_34343
我假设你的shell是bash / zsh / ksh
答案 2 :(得分:0)
awk 'FNR==NR{a[$0];next}!($1 in a)' fileA fileB
检查here