所以我有 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
Run Code Online (Sandbox Code Playgroud)
Sb:Minot:amsen
Jbb:Kimmel:verlin
R:Dillain:bodent
Mb:Flikk:kentin
Jb:Brude:kemin
Run Code Online (Sandbox Code Playgroud)
我想通过第二列(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...
Run Code Online (Sandbox Code Playgroud)
我正在考虑sed
为此使用,但任何基于 Unix 的东西都会很棒。我没有运气试图自己想出一种方法来做到这一点。
这听起来像是一个任务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)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
-t
将字段分隔符设置为 :
-o
设置打印格式-j
加入列号 2
<(sort -k2,2 -t: file)
按-k
第二列对文件进行预排序,-t
将字段分隔符设置为:
这是一个简单的任务awk
:
awk -F':' -vOFS=':' 'NR==FNR{a[$2]=$0;next}{print $0,a[$2]}' file2 file1
Run Code Online (Sandbox Code Playgroud)
首先,我们将:
输入(with -F
)和输出(with OFS
)都设置为字段分隔符,然后如果处理了第一个文件(file2
),我们将整行分配给以第二个字段索引的表元素。当处理下一个文件 ( file1
) 时,我们打印它的行,添加存储在a[$2]
) 中的前一个文件的行。