在另一个文件中查找file1中的每个字符串

时间:2017-03-21 13:16:03

标签: shell awk sed grep

以下是两个文件的内容,

文件:1

257054
256986
257144

文件:2

257054|Guestroom|http://397_b.jpg|350|350||http://397/hotels/2000000/1330000/1321300/1321278/1321278_397_t.jpg|0
257057|Guestroom|http://398_b.jpg|350|350||http://398/hotels/2000000/1330000/1321300/1321278/1321278_398_t.jpg|0

我需要一个Bash命令来比较两个文件,输出只包含

257054|Guestroom|http://397_b.jpg|350|350||http://397/hotels/2000000/1330000/1321300/1321278/1321278_397_t.jpg|0

我可以使用普通的for循环迭代,但它非常慢。我需要一些使用awk或sed快速处理的解决方案。

3 个答案:

答案 0 :(得分:3)

如果file1的内容只能显示在file2的第一个位置,您可以使用fgrep

$ cat file1
257054
256986
257144
$ cat file2
257054|Guestroom|http://397_b.jpg|350|350||http://397/hotels/2000000/1330000/1321300/1321278/1321278_397_t.jpg|0
257057|Guestroom|http://398_b.jpg|350|350||http://398/hotels/2000000/1330000/1321300/1321278/1321278_398_t.jpg|0
$ fgrep -f file1 file2
257054|Guestroom|http://397_b.jpg|350|350||http://397/hotels/2000000/1330000/1321300/1321278/1321278_397_t.jpg|0

请注意,您可以将fgrep替换为grep -F:两者都是POSIX。使用fgrep模式将file1的内容视为一组文字模式,每行一个。在没有grep -f的情况下尝试-F将无法获得所需的结果。

如果来自file1的数字除了行首之外可能存在file2中的其他地方,那么您可以通过将grep与例如sed组合来创建更明确的匹配:

grep -f <(sed 's/.*/^&|/g' file1) file2

仅当file1 中的数字出现在行的开头,后跟管道(|时,才匹配$("#SearchByVIN").click(function() { $("#error").hide(); var formData = $('#vinSerach').serialize(); $.ajax({ type: "POST", url: "ErrorVin", data: formData, crossDomain: false, async : true, success: function(response) { if(response){ $("#error").show(); $("#error").html(response); $(window).scrollTop($('#error').offset().top); }else{ $("#searchResult").show(); $("#searchResult_info").show(); $("#searchResult_paginate").show(); var oTable = $('#searchResult').dataTable( { "bDestroy": true, "iDisplayLength": 2, "bFilter": false, "bFilter": false, "bLengthChange": false, "sAjaxSource": "SearchByVIN", "aoColumns": [ { "mData": "gdId" }, { "mData": "agency" }, { "mData": "documentType" }, { "mData": "countyName" }, { "mData": "organizationName" } ] } ); } }, error: function(result){ alert(result); } }); }); 中的数字。

答案 1 :(得分:3)

您可以一次性Awk执行此操作,

awk 'BEGIN{FS=OFS="|"}FNR==NR{file1[$0]; next}$1 in file1' file1 file2

file1 上将内容哈希到数组file1的索引中,并在 file2 上打印$1seen中的那些行}。

答案 2 :(得分:2)

您也可以使用join

$ join -t \| f1 f2
257054|Guestroom|http://397_b.jpg|350|350||http://397/hotels/2000000/1330000/1321300/1321278/1321278_397_t.jpg|0

man join教育我们:

NAME
       join - join lines of two files on a common field

SYNOPSIS
       join [OPTION]... FILE1 FILE2

       -t CHAR
              use CHAR as input and output field separator