gpt4 book ai didi

linux - 使用awk比较两个文件并打印包含与其他文件匹配的文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:31 27 4
gpt4 key购买 nike

我有两个文件:

文件1.txt

919167,hutch,mumbai
919594,idea,mumbai

文件2.txt

919167000000
919594000000

输出

919167000000,hutch,mumbai
919594000000,idea,mumbai

如何使用 AWK 实现此目的?我有一个巨大的电话号码文件,需要像这样进行比较。我相信 Awk 可以处理它;如果没有,请告诉我该怎么做。


额外定义

  • 公共(public)部分总是 6 位数字吗?是的,总是 6。
  • 这两个文件是否已排序? file1 未排序。 file2 可以排序。
  • 文件 2 中的尾随数字是否始终为零?不,这些是可以变化的电话号码,这样做的目的是获取电话号码的序列信息。
  • 对于给定的数字,文件 1 包含三个记录而文件 2 包含 2 个记录是否有任何危险,或者它是一对一的?它是一对一的。文件 1 中是否存在文件 2 中没有匹配项的记录,或者反之亦然?_ 是。
  • 如果是这样,您想查看不匹配的记录吗?是的,我想要两条记录。

扩展数据

文件1.txt

919167,hutch,mumbai
919594,idea,mumbai
918888,airtel,karnataka

文件2.txt

919167838888
919594998484
919212334323

预期输出:

919167838888,hutch,mumbai
919594998484,idea,mumbai
919212334323,nomatch,nomatch

最佳答案

正如我在评论中指出的那样,需要大量未说明的信息才能给出明确的答案。然而,我们可以做出一些合理的猜测:

  1. 公共(public)编号是文件 2 的前 6 位数字(我们不关心尾随数字,但会简单地将它们复制到输出中)。
  2. 文件按顺序排序。
  3. 如果任一文件中有不匹配的记录,这些记录将被忽略。

选择的工具大概是sedjoin :

sed 's/^\([0-9]\{6\}\)/\1,\1/' file2.txt |
join -t, -o 1.2,2.2,2.3 - file1.txt

这会编辑 file2.txt创建一个以逗号分隔的第一个字段,其中包含 6 位电话号码,后跟该行的所有其余部分。输入被馈送到 join命令,它连接到第一列,并从 file2.txt 输出“行的其余部分”(第 2 列)以及来自 file1.txt 的第 2 列和第 3 列.

如果电话号码是可变长度的,那么匹配操作就会非常复杂。为此,我会使用 Perl(或 Python)来完成这项工作。如果数据未排序,则可以在将其输入命令之前对其进行排序。如果您想要不匹配的记录,您可以在 join 的选项中指定如何处理这些记录。 .


所需的额外信息现在可用。关键信息是 6 位数是固定的——呸!因为你在 Linux 上,我假设 bash可用于“进程替换”:

sort file2.txt |
sed 's/^\([0-9]\{6\}\)/\1,\1/' |
join -t, -o 1.2,2.2,2.3 -a 1 -a 2 -e 'no-match' - <(sort file1.txt)

如果进程替换不可用,只需对 file1.txt 进行排序现场:

sort -o file1.txt file1.txt

然后使用file1.txt代替 <(sort file1.txt) .


我认为评论可能会要求输入,例如:

文件1.txt

919167,hutch,mumbai
919594,idea,mumbai
902130,airtel,karnataka

文件2.txt

919167000000
919594000000
919342313242

输出

no-match,airtel,karnataka
919167000000,hutch,mumbai
919342313242,no-match,no-match
919594000000,idea,mumbai

如果这不是评论的内容,请通过编辑问题来澄清,以添加额外的数据并以比评论允许的更具可读性的格式输出。


使用扩展数据,这个稍微修改的命令:

sort file2.txt |
sed 's/^\([0-9]\{6\}\)/\1,\1/' |
join -t, -o 1.2,2.2,2.3 -a 1 -e 'no-match' - <(sort file1.txt)

产生输出:

919167838888,hutch,mumbai
919212334323,no-match,no-match
919594998484,idea,mumbai

这看起来更像是所需输出的排序版本。 -a n选项控制是否打印来自文件 1 或文件 2(或两者)的不匹配记录; -e选项控制为不匹配字段打印的值。所有这些都可以从 join 的手册页中轻松获得。 ,当然。

关于linux - 使用awk比较两个文件并打印包含与其他文件匹配的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12720825/

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