Shell grep使用文件内容查找缺少的内容

Shell grep使用文件内容查找缺少的内容,shell,csv,grep,Shell,Csv,Grep,我正在尝试查找在其他文件集合的任何行中都不显示的文件行 我将以下代码放在一起,但它似乎只适用于names.csv中的最后一行 missing.csv Fred Jack Ian Louis names.csv是一个没有标题的单列文件,如下所示: Fred Jack Ian Louis Ash 记录/**.csv文件是800mb以上的记录文件,包含许多列。名称列值用双引号括起来表示其值 name,email,etc.. "Fred",fred@fred.com... "Ash",ash@ash

我正在尝试查找在其他文件集合的任何行中都不显示的文件行

我将以下代码放在一起,但它似乎只适用于
names.csv中的最后一行

missing.csv
Fred
Jack
Ian
Louis
names.csv是一个没有标题的单列文件,如下所示:

Fred
Jack
Ian
Louis
Ash
记录/**.csv文件是800mb以上的记录文件,包含许多列。名称列值用双引号括起来表示其值

name,email,etc..
"Fred",fred@fred.com...
"Ash",ash@ash.com...
"Jack",jack@jack.com...
我的链接命令:

grep-whof names.csv记录/*.csv | grep-vFf/dev/stdin names.csv>missing.csv

missing.csv
Fred
Jack
Ian
Louis
这会发现
Ash
在其中一个文件中,而我最终发现所有其他文件仍然丢失


如何正确使用文件内容进行grep?

如果我理解正确,您看到的名称不属于
记录/*.csv
,但列在
名称.csv

如果是这样,您可以使用此
awk
脚本:

awk 'NR==FNR{a[$1];next}{b[$2]}END{for(i in a)if(!(i in b)) print i}' names.csv FS='"' records/*.csv
第一个块语句
NR==FNR{a[$1];next}
names.csv
的内容填充数组
a

下一个块
{b[$2]}
用文件名
记录/*.csv
填充数组
b

最后一个block语句正在
a
中查找
b
中没有的名称,并将其打印出来。

尝试以下操作:

  • 使用GNU
    cut
    (Linux):

  • 带BSD
    cut
    (BSD、OSX)


  • 您能否创建一个显示问题并用于测试目的的最小示例?您已经显示了
    names.csv
    ,创建了两个小样本文件,比如
    foo.csv
    baz.csv
    ,每个文件只有几行,另外一个样本是
    topxyz.csv
    ,然后显示这些样本的完整预期输出。我对
    -k2
    参数有问题(剪切:非法选项--k)可能是因为我使用的是OSX而不是Linux,所以切换到
    -f2
    ,因此命令看起来像
    cut-f2-d''records/*.csv | sort-u | grep-vf/dev/stdinnames.csv
    它工作得很好,达到了预期的效果!谢谢!=d
    cut -f2 -d '"' records/*.csv | sort -u | 
      grep -vf /dev/stdin names.csv