gpt4 book ai didi

linux - 使用 Linux 匹配两个文件中的数字

转载 作者:太空宇宙 更新时间:2023-11-04 11:10:47 24 4
gpt4 key购买 nike

我想使用 Linux 命令或脚本比较两个文件中的数据。第一个文件有一系列的 7 个数字,后面一行是一个名字,文件中有几行数字和名字。数字不能在同一行重复,但可以在另一行找到,并且将在每一行上按顺序列出。

文件 1 示例:

01 02 03 04 05 06 07 姓名 1

11 12 13 14 15 16 17 姓名 2

01 03 05 11 12 14 16 姓名 3

...

我想知道 File1 中的一行数字何时与 File2 中的另一组数字相匹配。 File2中的数字不重复,会按顺序排列。

文件 2 示例:

01 02 03 04 05 11 12 13 14 15 16 18 20

一旦 File1 中的一行数字与 File2 中的任何数字匹配,我希望显示匹配的行,包括名称。

输出示例:

01 03 05 11 12 14 16 姓名 3

如果没有匹配,我想显示“No Match”或类似的。

我是 Linux 和脚本文件的新手,感谢所有帮助。谢谢。

最佳答案

这在 Awk 中很容易做到。让我们零敲碎打。

NR==FNR { for (i=1; i<=NF; ++i) a[$i]=1; next }

当我们读取第一个输入文件时,NR==FNR 条件为真。我们遍历输入字段,并在关联数组 a 中为每个字段分配一个键。这现在包含来自第一个文件的输入字段(我们将在运行它时确保它是 File2)。

在另一个文件的行中,遍历字段直到倒数第二个字段(我们跳过最后一个包含标识符的字段,如 Name2)。如果任何值不在 a 中,则放弃此行。

{ for (i=1; i<NF; i++) if (! ($i in a)) next }

否则,打印。

1

(单独的 1 是一个 Awk 惯用语,如果我们在脚本中遇到这个部分,它会打印输入。这是一个非常正确的条件,没有任何操作;默认操作是打印输入行。)

将所有内容收集到一个 shell 脚本片段中,我们得到

awk 'NR==FNR { for (i=1; i<=NF; ++i) a[$i] = 1; next }
{ for (i=1; i<NF; i++) if (! ($i in a)) next } 1' File2 File1

这假设 File2 只包含一行。如果你想扩展到多行,Awk 的能力会有点紧张;到那时,也许可以考虑切换到 Perl 或 Python(或您碰巧熟悉的任何其他语言)。 Awk 的魅力在于它简单 -- 一天学会,一周就能写出好的脚本。

关于linux - 使用 Linux 匹配两个文件中的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23332618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com