我有两个文件:
$ cat File1
A
B
C
$ cat File2
A aaa B
D bbb A
B aaa h
我想从File1
into中搜索模式File2
,这是一种可行的方法,但仅搜索 in中grep -f File1 File2
报告的模式File1
$1
File2
示例输出:
$cat File3
A aaa B
B aaa h
答案1
和awk
:
awk 'NR==FNR{a[$0]=NR; next} a[$1]' f1.txt f2.txt
NR==FNR{a[$0]=NR; next}
:对于第一个文件 (f1.txt
),我们将记录作为关联数组的键,并以相应的记录号作为值a[$1]
:对于第二个文件 (f2.txt
),仅当第一个字段是数组的键时才打印记录a
例子:
% cat f1.txt
A
B
C
% cat f2.txt
A aaa B
D bbb A
B aaa h
% awk 'NR==FNR{a[$0]=NR; next} a[$1]' f1.txt f2.txt
A aaa B
B aaa h
答案2
使用join
命令:
join <(sort file1) <(sort file2)
如果文件已排序。
join file1 file2
答案3
使用bash
或任何理解进程替换的 shell:
$ grep -f <( awk '{ printf("^%s[[:blank:]]\n", $0) }' File1 ) File2
A aaa B
B aaa h
这里的想法是通过将from中的每一行转换为正则表达式来创建正确的模式,以便grep -f File1
直接使用(在其前面加上扬抑符,并在其后面加上后缀)File2
File
something
^something[[:blank:]]
[[:blank:]]
)
扬抑符将模式锚定到行的开头,并[[:blank:]]
强制与空格或制表符匹配。
GNUgrep
还可以从标准输入读取模式:
$ awk '{ printf("^%s[[:blank:]]\n", $0) }' File1 | grep -f - File2
A aaa B
B aaa h
该awk
命令可以替换为等效sed
命令(如果您sed
更喜欢awk
):
$ sed -e 's/^/^/' -e 's/$/[[:blank:]]/' File1 | grep -f - File2