内部连接两个文本文件

时间:2012-11-07 15:24:10

标签: linux bash join

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

5 个答案:

答案 0 :(得分:6)

文件2最后是否应包含LUA

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

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

答案 1 :(得分:5)

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

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

这是如何运作的?

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

答案 2 :(得分:4)

您可以修改此脚本:

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

while循环逐行读取file2并将该行赋予grep命令,该命令在file1中触及该行。可以使用grep选项删除一些额外的输出。

答案 3 :(得分:4)

看起来你只需要

grep -F -f file2 file1

答案 4 :(得分:0)

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

paste [option] source files [>destination file]

对于你的例子,它将是

paste file1.txt file2.txt >result.txt