内部连接两个文本文件

Dav*_*ier 8 linux bash join

希望在两个不同的文本文件上执行内部联接.基本上我正在寻找GNU连接程序的内连接等价物.这样的事情存在吗?如果没有,awk或者sed解决方案最有帮助,但我的第一选择是Linux命令.

这是我想要做的一个例子

档案1:

0|Alien Registration Card LUA|Checklist Update
1|Alien Registration Card LUA|Document App Plan
2|Alien Registration Card LUA|SA Application Nbr
3|Alien Registration Card LUA|tmp_preapp-DOB
0|App - CSCE Certificate LUA|Admit Type
1|App - CSCE Certificate LUA|Alias 1
2|App - CSCE Certificate LUA|Alias 2
3|App - CSCE Certificate LUA|Alias 3
4|App - CSCE Certificate LUA|Alias 4
Run Code Online (Sandbox Code Playgroud)

档案2:

Alien Registration Card LUA
Run Code Online (Sandbox Code Playgroud)

结果:

0|Alien Registration Card LUA|Checklist Update
1|Alien Registration Card LUA|Document App Plan
2|Alien Registration Card LUA|SA Application Nbr
3|Alien Registration Card LUA|tmp_preapp-DOB
Run Code Online (Sandbox Code Playgroud)

cho*_*oba 6

file2 LUA最后是否应该包含?

如果是,您仍然可以使用join:

join -t'|' -12 <(sort -t'|' -k2 file1) file2
Run Code Online (Sandbox Code Playgroud)


gle*_*man 6

看起来你只需要

grep -F -f file2 file1
Run Code Online (Sandbox Code Playgroud)


gho*_*oti 5

这是一个awk选项,因此您可以避免bash依赖(为了可移植性):

$ awk -F'|' 'NR==FNR{check[$0];next} $2 in check' file2 file1
Run Code Online (Sandbox Code Playgroud)

这是如何运作的?

  • -F'|' - 设置字段分隔符
  • 'NR==FNR{check[$0];next} - 如果总记录数与文件记录号匹配(即我们正在读取提供的第一个文件),那么我们填充一个数组并继续.
  • $2 in check - 如果我们创建的数组中提到了第二个字段,则打印该行(如果未提供任何操作,则为默认操作).
  • file2 file1 - 文件.由于NR==FNR构造,顺序很重要.