【问题标题】:compare File 2(Include substrings/strings) against File 1(include strings) and store only the first match line from File 1将文件 2(包括子字符串/字符串)与文件 1(包括字符串)进行比较,并仅存储文件 1 中的第一个匹配行
【发布时间】:2020-11-15 18:52:09
【问题描述】:

我有 2 个文件

文件 1

A0001  C001
B0003  C896
A0024  C234
B1542  C231
A0001  C001
A0024  C234

最多 15000 条这样的行。

文件 2

B1542
A0024  C234
A0001
A0024

和 5000 条这样的行。

我想比较文件 2(包括子字符串/字符串)和文件 1(包括字符串)并存储文件 1 中唯一的第一个匹配行,所以最终结果应该是这样的:

B1542  C231
A0024  C234
A0001  C001
A0024  C234

我尝试使用 awk 或 grep,但我什至没有接近最终解决方案

awk 'FNR==NR{a[$1];next}($1 in a){print}' file2 file1

这个 awk 只打印完整的匹配项 - 如果子字符串包含,它会忽略

grep -Ff File2 File1

这个 grep 打印所有匹配项,而不仅仅是第一个匹配项

感谢您的帮助

附:文件 1 可以包含重复的字符串

【问题讨论】:

  • 感谢您以代码的形式展示您的努力。您能否在问题中的输入和预期输出样本中更清楚一些。请编辑您的示例,然后让我们知道。
  • 假设对于这个示例,只有文件 2 中的 4 个子字符串出现在文件 1 中,因此它会按照文件 2 中出现的顺序打印文件 1 中仅有的 4 个匹配项
  • 我想请您用更清晰的示例编辑您的问题,以便更好地理解谢谢。
  • 非常感谢您尝试帮助我。如果您有任何不清楚的地方,请提出问题,我会回答,我认为我在这里给出的示例满足了需求。如果有任何不清楚的地方,我很乐意回答
  • 考虑到您只想打印找到的第一个匹配项,请尝试awk 'FNR==NR{a[$1];next}($1 in a){print;delete a[$1]}' file2 file1,如果这对您有帮助,请告诉我?

标签: bash file compare


【解决方案1】:

您的问题不清楚,并且有一些边缘情况未涵盖,所以我不确定,但这可能是您想要做的:

$ cat tst.awk
NR==FNR {
    if ( !($1 in key2val) ) {
        key2val[$1] = $0
    }
    next
}
$1 in key2val {
    $0 = key2val[$1]
}
{ print }

.

$ awk -f tst.awk file1 file2
B1542  C231
A0024  C234
A0001  C001
A0024  C234

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 2022-07-05
    • 2022-01-06
    • 1970-01-01
    • 2018-04-23
    相关资源
    最近更新 更多