对不起这个问题的标题有点令人困惑但我无法想到其他任何事情。 我正在尝试做这样的事情
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
答案 0 :(得分:11)
完全摆脱cat
和awk
:
grep -f fileA.txt fileB.txt
答案 1 :(得分:4)
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.)