内部连接两个文本文件

希望在两个不同的文本文件上执行内部连接。 基本上我正在寻找GNU连接程序的内部连接等价物。 这样的事情是否存在? 如果不是, awksed解决scheme将是最有帮助的,但我的第一个select将是一个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 

文件2:

 Alien Registration Card LUA 

结果:

 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 

不应该在最后包含LUA

如果是的话,你仍然可以使用join

 join -t'|' -12 <(sort -t'|' -k2 file1) file2 

你可以修改这个脚本:

 cat file2 | while read line; do grep $line file1 # or whatever you want to do with the $line variable done 

while循环逐行读取file2,并将该行指向grep命令,grep命令将file1中的那一行擦除。 有一些额外的输出,可能会删除与grep选项。

这里有一个awk选项,所以你可以避免bash依赖(为便携性):

 $ awk -F'|' 'NR==FNR{check[$0];next} $2 in check' file2 file1 

这个怎么用?

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

看起来你只是需要

 grep -F -f file2 file1 

你可以使用粘贴命令来合并文件:

 paste [option] source files [>destination file] 

对于你的例子,这将是

 paste file1.txt file2.txt >result.txt