【问题标题】:grep, awk or sed to Match and Combine Two Filesgrep、awk 或 sed 匹配和合并两个文件
【发布时间】:2014-09-05 10:21:41
【问题描述】:

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

文件 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

【问题讨论】:

  • 你看过man join吗?

标签: awk sed


【解决方案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 必须位于命令行的第一位。

【讨论】:

  • File2 必须排在第一位,确定吗?
  • 如果 file2 中只有 130 行,我想你只能得到 130 行的输出,但我有点认为 OP 期望的不止这些......虽然目前还不清楚你应该在没有匹配项时执行。
  • 如果 2 中的 ID 在 1 中重复,可能会有更多行。但是,是的,OP 的用例有些不清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 2013-07-07
  • 1970-01-01
  • 2020-08-24
相关资源
最近更新 更多