grep 模式从 file1 到 file2 的列

grep 模式从 file1 到 file2 的列

我有两个文件:

$ cat File1
A
B
C
$ cat File2
A aaa B
D bbb A
B aaa h

我想从File1into中搜索模式File2,这是一种可行的方法,但仅搜索 in中grep -f File1 File2报告的模式File1$1File2

示例输出:

$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直接使用(在其前面加上扬抑符,并在其后面加上后缀)File2Filesomething^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

相关内容