【问题标题】:AWK compare two columns form different files and merge outputs [duplicate]AWK比较来自不同文件的两列并合并输出[重复]
【发布时间】:2021-01-16 05:18:38
【问题描述】:

我需要帮助 :) 我有两个文件(都很大)。

文件 1:

1a04    1a04
9   161.9
10  143.5
11  146.8
12  111.5
13  100.2
14  75.2
15  46.1
16  90.3
17  93.3
18  119.9
19  178.9
20  171.4
21  168.4
22  169.0
23  176.4
24  167.0
25  164.5

文件2

1a04    1a04
5   0
6   -
7   E
8   E
9   E
10  E
11  E
12  E
13  -
14  S
15  >>
16  H
17  H
18  H
19  H
20  H

我想比较两个文件的第一列,如果它们匹配,则将它们合并到一个新文件中。 所以我需要的输出是:

1a04  1a04  1A04
9   161.9  E
10  143.5  E
11  146.8  E
12  111.5  E
13  100.2  -
14  75.2   S
15  46.1   >>
16  90.3   H
17  93.3   H
18  119.9  H
19  178.9  H
20  171.4  H

我尝试了多个 awk 组合,但我无法获得我想要的确切输出 感谢您的帮助

【问题讨论】:

  • 考虑使用 (POSIX) join 命令而不是 awk。假设文件 file1file2 按排序顺序排列 join -o 1.1,1.2,2.2 file1 file2。如果它们未按排序顺序,请先排序,或使用process substitutionjoin -o1.1,1.2,2.2 <(sort file1) <(sort file2)
  • 您好,感谢您的回复,很遗憾,我无法对它们进行排序,这就是我正在寻找和 awk 解决方案的原因
  • 为什么不能对它们进行排序?鉴于示例数据,显示的join 命令会产生您想要的输出 - 给定或获取列之间的间距(这是不稳定的,因此非常难以准确重现)。
  • 我不能,因为我在文件中有多个标题行(例如: 1a04 1a04 ),当我尝试加入命令时这些标题行被删除。

标签: bash file awk


【解决方案1】:

使用 2 阶段 awk 将是:

awk 'FNR == NR { map[$1]=$2; next} $1 in map { print $0, map[$1] }' file2 file1 |
column -t
1a04  1a04   1a04
9     161.9  E
10    143.5  E
11    146.8  E
12    111.5  E
13    100.2  -
14    75.2   S
15    46.1   >>
16    90.3   H
17    93.3   H
18    119.9  H
19    178.9  H
20    171.4  H

【讨论】:

  • 谢谢,我已经尝试过你的建议,但它似乎对我不起作用1a04 1a04 1a04 9 161.9 S 10 143.5 G 11 146.8 G 12 111.5 G 13 100.2 S 14 75.2 > 15 46.1 H 16 90.3 H 17 93.3 H 18 119.9 H 19 178.9 H 20 171.4 H 21 168.4 T 22 169.0 T 23 176.4 T 24 167.0 T 25 164.5 S
  • 您的示例文件的输出附在答案中,它与您的预期输出不匹配吗?检查您的输入文件以确保两个文件都有 2 列,并且其中任何一个都没有 DOS 行结尾。
  • 是的,当我尝试将其扩展到整个文件时,输出完全不同(我只附上了示例文件的一部分)。
  • 然后提供有问题的实际数据的小样本。如果没有看到实际数据,我无法猜测解决方案。
  • @Fede: 嗯——两个文件中有 34 MiB 左右的数据。没有解释出了什么问题。这有点难以帮助你。您应该创建一个 MCVE(Minimal, Complete, Verifiable Example — 或 MRE 或 SO 现在使用的任何名称)或 SSCCE(Short, Self-Contained, Correct Example)。您可能仍需要一个外部站点来托管数据,但显示问题不应占用 34 MiB。
猜你喜欢
  • 2017-09-02
  • 2014-02-20
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多