10

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

5 回答 5

10

这是一个 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构造,顺序很重要。
于 2012-11-07T16:01:48.523 回答
8

file2 最后不应该包含LUA吗?

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

join -t'|' -12 <(sort -t'|' -k2 file1) file2
于 2012-11-07T15:34:59.100 回答
8

看起来你只需要

grep -F -f file2 file1
于 2012-11-07T21:42:47.843 回答
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。有一些额外的输出可能会被 grep 选项删除。

于 2012-11-07T15:36:14.303 回答
1

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

paste [option] source files [>destination file]

对于您的示例,它将是

paste file1.txt file2.txt >result.txt
于 2012-11-07T15:35:02.603 回答