grep“输出cat命令 - 每行”在另一个文件中

时间:2013-01-10 22:25:35

标签: shell grep cat

对不起这个问题的标题有点令人困惑但我无法想到其他任何事情。 我正在尝试做这样的事情

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

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

我想要的是从fileA获取id,在另一个文件-b中获取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 个答案:

答案 0 :(得分:11)

完全摆脱catawk

grep -f fileA.txt fileB.txt

答案 1 :(得分: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教程。

答案 2 :(得分:1)

如果ID位于不同的行,您可以使用-f中的grep选项:

cut -d "|" -f1 < fileB.txt | grep -F -f fileA.txt

cut命令将确保在使用grep的模式搜索中仅搜索第一个字段。

从手册页:

-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.)