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

标签 linux

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

相关文章:

c - 从 pthread 退出会释放 malloced 内存吗?

c++ -/usr/bin/C++ 无法使用共享库编译为 gcc

linux - 无论如何改变光标 "vertical line"而不是一个框?

linux - 为什么 bash 不会因短路命令序列中的错误而停止?

linux - GNU find -exec 命令 {} ; vs -exec 命令 {} +

c++ - sys/*.h 文件的实现在哪里?

Linux 设备树帮助(GPIO Controller /中断)

linux - shell 脚本中的意外 token 'done'

java - 如何弄清楚 .class 文件的作用?

r - linux redhat gsl R安装错误: cannot run C compiled programs.