匹配并粘贴到线条

匹配并粘贴到线条

所以我有 2 个非常大的文本文件,由如下行组成:

第一的:

Robert:Dillain:Other:Other:Other
Julian:Brude:Other:Other:Other
Megan:Flikk:Other:Other:Other
Samantha:Minot:Other:Other:Other
Jesus:Kimmel:Other:Other:Other

第二:

Sb:Minot:amsen
Jbb:Kimmel:verlin
R:Dillain:bodent
Mb:Flikk:kentin
Jb:Brude:kemin

我想通过以下方式匹配它们第二栏(Dillain、Brude 等)并将它们粘贴到如下行:

输出:

Robert:Dillain:Other:Other:Other:R:Dillain:bodent
Jesus:Kimmel:Other:Other:Other:Jbb:Kimmel:verlin
Samantha:Minot:Other:Other:Other:Sb:Minot:amsen
etc...
etc...

我正在考虑使用sed它,但任何基于 Unix 的东西都很棒。我自己没能想出一种方法来做到这一点。

答案1

这听起来像是一个任务join

join -t":" -o "1.1,1.2,1.3,1.4,1.5,2.1,2.2,2.3" \
   -j 2 <(sort -k2,2 -t: test1) <(sort -k2,2 -t: test2)

输出:

Julian:Brude:Other:Other:Other:Jb:Brude:kemin
Robert:Dillain:Other:Other:Other:R:Dillain:bodent
Megan:Flikk:Other:Other:Other:Mb:Flikk:kentin
Jesus:Kimmel:Other:Other:Other:Jbb:Kimmel:verlin
Samantha:Minot:Other:Other:Other:Sb:Minot:amsen

分解:

  • -t将字段分隔符设置为:
  • -o设置打印格式
  • -j连接列号2
  • <(sort -k2,2 -t: file)-k按第二列对文件进行预排序,-t将字段分隔符设置为:

答案2

这是一个简单的任务awk

awk -F':' -vOFS=':' 'NR==FNR{a[$2]=$0;next}{print $0,a[$2]}' file2 file1

首先,我们将输入(使用)和输出(使用)设置:为字段分隔符,然后如果处理第一个文件(),我们将整行分配给用第二个字段索引的表元素。当处理下一个文件 ( ) 时,我们打印它的行,添加存储在 ) 中的上一个文件中的行。-FOFSfile2file1a[$2]

答案3

sed你一起也许可以做到:

sed 's|[^:]*:\([^:]*\).*|/^[^:]*:\1:/s/$/:&/;t|' file2 | sed -f - file1

...这将涉及一个sed进程读取第二个文件并编写一个sed脚本以将第一个文件编辑到第二个sed文件的标准输入中。据我所知,直接将内容逐字注入到这样的正则表达式中应该不会有任何问题。如果输入中可能存在元字符,则此站点上有大量答案讨论转义它们的方法。不过,如果可能需要的话,以下内容就足够了:

sed 's|[]&\./*[]|\\&|g;s|...' ... | sed -f - file1

尽管如此,同名的解决方案可能join是更好的解决方案 - 这只是为了演示如何做到这一点,sed因为您提到了它。

sed不管怎样,第二个适用的脚本file1最终看起来像(对于 file2 中的每一行,都有类似于下面的行):

/^[^:]*:Dillain:/s/$/:R:Dillain:bodent/;t

...这意味着如果遇到匹配的行迪兰对于第二个冒号分隔的字段,那么它应该附加:R:迪兰:博登特串到它的尾巴上。因为如果已经附加了file1一行 from ,那么继续尝试匹配一行可能是没有意义的,所以尾随的est 命令会在完成后立即分支掉任何成功的替换。file2t

答案4

通过蟒蛇3

#!/usr/bin/python3
import csv
import sys
file1, file2 = sys.argv[1], sys.argv[2]
with open(file2) as second, open(file1) as first:
    second_list = second.readlines()
    first_list = first.readlines()
for line1 in first_list:
    for line2 in second_list:
        if line1.split(':')[1] == line2.split(':')[1]:
            print(line1.strip()+line2.strip())

将上述脚本复制并粘贴到名为 的文件中script.py。然后通过在终端上运行以下命令来运行脚本。

python3 script.py file1 file2

相关内容