所以我有 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
首先,我们将输入(使用)和输出(使用)设置:
为字段分隔符,然后如果处理第一个文件(),我们将整行分配给用第二个字段索引的表元素。当处理下一个文件 ( ) 时,我们打印它的行,添加存储在 ) 中的上一个文件中的行。-F
OFS
file2
file1
a[$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 命令会在完成后立即分支掉任何成功的替换。file2
t
答案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