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
文件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
#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
评论
谢谢!是的,应该(我已经更新了问题)。我不知道有人可以通过stdin掏出并把结果反馈回来。非常有用!
–戴夫·斯尼吉尔(Dave Snigier)
2012年11月7日16:00
@DaveSnigier:您总是可以创建一个临时文件,但是Process Substitution的键入要短得多。
–乔罗巴
2012年11月7日16:08