grep,awk或sed匹配和组合两个文件

时间:2014-07-11 17:26:11

标签: awk sed

我需要匹配两个文件中的一个字段,然后合并两个文件中的字段。

文件1将是巨大的,可能有近1200万行。文件2只有大约130行。

我试过了 -

egrep -f file1 file2

这只给了我在file2中包含的匹配信息。

有没有办法匹配两个文件中的信息,然后合并两个文件中的部分?

另外,我需要一些有效的东西,因为file1非常大。

所有字段都以管道分隔。

以下是两个文件的内容以及输出文件。我在每个文件中都包含了一个密钥。

非常感谢任何指导。

文件1:

1234567890|1|6664|NA|KY|0|0|18
2345678901|22|1958|NA|MT|0|0|77
3456789012|3|991B|NA|EM|0|0|13
4567890123|3223|154E|NA|NY|0|0|52
5678901234|8|008F|NA|AZ|0|0|04
6789012345|27|D983|NA|IT|0|0|0

文件1键

Field 1: 10 digit number
Field 2: variable length numeric characters
Field 3: 4 alpha-numeric characters
Field 4: 2 alpha characters
Field 5: 2 alpha characters
Field 6: 1 digit number
Field 7: 1 digit number
Field 8: variable length numeric characters

文件2:

6664|Dr. Zhivago|Russian Literature|421
1958|Dr. Spock|Child Psychology|308
991B|Dr. Martin|Shoe Design|406
3223|Dr. House|Diagnostic Skills|440
008F|Dr. Evil|Global Political Economy|326
D983|Dr. Quincy|Processes of Science: Forensics|156

文件2键

Field 1: 4 alpha-numeric characters
Field 2: Variable length alpha-numeric characters
Field 3: Variable length alpha-numeric characters
Field 4: 3 digit number

必需输出:

1234567890|1|6664|Russian Literature
2345678901|22|1958|Child Psychology
3456789012|3|991B|Shoe Design
4567890123|3223|154E|Diagnostic Skills
5678901234|8|008F Global Political Economy
6789012345|27|D983|Processes of Science: Forensics

输出键

从文件1 -

Field 1: 10 digit number
Field 2: variable length numeric characters
Field 3: 4 alpha-numeric characters

来自档案2 -

Field 4: Variable length alpha-numeric characters

1 个答案:

答案 0 :(得分:1)

相对较小,file2的相关内容将适合内存。因此,将其粘贴到一个数组中,键入id号,对于file1中的每一行,检查它是否在数组中,如果是,则以所需格式打印输出。

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

请注意,file2必须首先出现在命令行中。