我想使用 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/