如何从文件中获取模式并在unix中搜索另一个文件

时间:2014-05-08 07:55:31

标签: unix search awk

我有2个文件File1和File2。 File1有一些以“|”分隔的值。例如,

A|a
C|c
F|f

File2也有一些以“|”分隔的值。例如,

a|1
b|2
c|3
d|4
e|5

表示File1中的第2列与File2的第1列相似。

我必须创建具有预期输出的第三个文件File3

A|a|1
C|c|3

我尝试在循环中获取每个记录,并使用“awk”在File2中搜索。

虽然有效,但问题是File1和File2都有超过500万条记录。

我需要一个优化的解决方案。

2 个答案:

答案 0 :(得分:2)

您可以使用此awk

awk -F'|' 'NR==FNR{a[$2]=$1;next} $1 in a { print a[$1],$1,$2 }' OFS="|" file1 file2 > file3

更清晰的方式:

awk  'BEGIN{ OFS=FS="|";} NR==FNR{a[$2]=$1;next} $1 in a { print a[$1],$1,$2 }' file1 file2 > file3

根据@Kent建议:

如果您的file2file3中有两列以上的列,那么,

awk  'BEGIN{ OFS=FS="|";} NR==FNR{a[$2]=$1;next} $1 in a { print a[$1],$0 }' file1 file2 > file3

下面,

FS - 字段分隔符

OFS - 输出字段分隔符

答案 1 :(得分:1)

这是join创建的内容:

$ join -t '|' -o '1.1,1.2,2.2' -1 2 -2 1 file1 file2
A|a|1
C|c|3

man join了解更多详细信息,并特别注意需要在连接字段上排序的文件(即file1的第2个字段和file2的第1个字段),因为您发布的示例输入是。