在不同的文件中,使用grep命令搜索“cat命令输出 - 每行”的内容

3

很抱歉,这个问题的标题有点令人困惑,但我想不出其他的标题了。 我正在尝试做类似于这样的事情。

cat fileA.txt | grep `awk '{print $1}'` fileB.txt

fileA包含100行,而fileB包含一亿行。

我想要的是从fileA中获取ID,在不同的文件fileB中搜索该ID并打印出该行。

e.g fileA.txt
1234
1233

e.g.fileB.txt
1234|asdf|2012-12-12
5555|asdd|2012-11-12
1233|fvdf|2012-12-11

期望的输出结果是:
1234|asdf|2012-12-12
1233|fvdf|2012-12-11
3个回答

11

完全摆脱catawk

grep -f fileA.txt fileB.txt

4
仅使用awk可以很好地完成这项工作:
awk -F'|' 'NR==FNR{a[$0];next;}$1 in a' fileA fileB

请查看以下测试:

kent$  head a b
==> a <==
1234
1233

==> b <==
1234|asdf|2012-12-12
5555|asdd|2012-11-12
1233|fvdf|2012-12-11

kent$  awk -F'|' 'NR==FNR{a[$0];next;}$1 in a' a b
1234|asdf|2012-12-12
1233|fvdf|2012-12-11

编辑

增加解释:

-F'|'  #| as field separator (fileA)
'NR==FNR{a[$0];next;} #save lines in fileA in array a
 $1 in a  #if $1(the 1st field) in fileB in array a, print the current line from FileB

由于我无法在此处进一步解释,抱歉。例如,awk如何处理两个文件,什么是NR和FNR..如果接受的答案对您不起作用,我建议尝试这个awk行。如果您想深入了解,请阅读一些awk教程。


1
+1 这应该是被接受的答案,因为 grep -f 会无意中匹配类似于 123411234 的内容。 - Steve
@Kent,您能解释一下“NR==FNR{a[$0];next;}$1 in a”的含义吗? - priyank
我正在尝试弄清楚是否要在特定列中执行grep操作... grep -f无法工作。 - priyank
@priyank 添加了简短的解释。 - Kent

1
如果id在不同的行上,您可以使用grep中的-f选项,如下所示:
cut -d "|" -f1 < fileB.txt | grep -F -f fileA.txt

cut 命令将确保在使用 grep 进行模式搜索时只搜索第一个字段。

来自 man 手册:

-f FILE, --file=FILE
Obtain patterns from FILE, one per line.  
The empty file contains zero patterns, and therefore matches nothing.
(-f is specified by POSIX.)

我认为你的grep命令也需要加上-F选项。你不想让文件A中的每一行都成为正则表达式模式,对吧? - Kent
1
OP已经接受了答案。如果他不会回来寻求更好的解决方案,那么grep命令可以处理他的“1亿行”文件B。祝他好运。 - Kent
@Kent,我这次犯了大错。我想我会把它留下来,至少现在有输入文件了。 - squiguy
@priyank,我想我对你想要匹配的字段感到困惑,正如Kent所指出的那样。很高兴你找到了解决方案。 - squiguy
squiguy和@Kent出于好奇,有什么更好的解决方案吗? - priyank
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接