希望对两个不同的文本文件执行内部联接。基本上,我正在寻找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


#1 楼

file2末尾是否应该包含LUA

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

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


评论


谢谢!是的,应该(我已经更新了问题)。我不知道有人可以通过stdin掏出并把结果反馈回来。非常有用!

–戴夫·斯尼吉尔(Dave Snigier)
2012年11月7日16:00

@DaveSnigier:您总是可以创建一个临时文件,但是Process Substitution的键入要短得多。

–乔罗巴
2012年11月7日16:08

#2 楼

看起来您只需要

grep -F -f file2 file1


#3 楼

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

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


这是如何工作的?


>
-F'|'-设置字段分隔符

'NR==FNR{check[ in check];next}-如果总记录数与文件记录数匹配(即,我们正在读取提供的第一个文件),则填充一个数组然后继续。

file2 file1-如果在我们创建的数组中提到了第二个字段,则打印该行(如果未提供任何操作,则为默认操作)。

NR==FNR-文件。由于q4312079q的构造,顺序很重要。


评论


我有一个场景,其中有一个列表,一个列表中没有重复的行,所以最后,我有两个文件:一个仅包含重复的行,另一个包含唯一性。因此,当我运行此awk时,它们像魅力一样融合了两者。谢谢@ghoti,它起作用了!

–里卡多·里维拉·尼维斯
8月19日12:41

#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选项删除。

评论


非常聪明!除了当前的问题之外,我将能够找到这种模式的许多用途

–戴夫·斯尼吉尔(Dave Snigier)
2012年11月7日15:58

不要忘记引用$ line。如果包含空格,则可能会严重扩展。另外,如果您要查找固定的字符串匹配而不是正则表达式(请记住,它是gREp),那么请使用-F选项。

–ghoti
2012年11月7日16:09

这只是@glennjackman对这一问题的低效率解释。 (是的,稍后再发布。)单个grep读取模式,然后只检查一次目标文件,比为每个模式运行一个grep效率要高得多,尤其是对于大型输入。

–tripleee
2015年12月16日在10:21



@ghoti的评论可能措辞更强烈。即使您的输入不包含空格,但是如果输入中包含任何外壳元字符,事情可能会变得非常糟糕。 TL; DR在此处省略引号是错误的。

–tripleee
17 Mar 30 '17 at 13:53

@ketil:不需要;只需使用grep -Fx(-F =固定字符串(不是regexp),-x =线匹配)。

– wchargin
18年7月16日在5:10

#5 楼

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

paste [option] source files [>destination file]


对于您的示例,它是

paste file1.txt file2.txt >result.txt


评论


关闭,但粘贴将仅在两个文件的行号上连接。我实际上正在寻找加入文件中的字段。

–戴夫·斯尼吉尔(Dave Snigier)
2012年11月7日16:03