以下是两个文件的内容,
文件: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快速处理的解决方案。
答案 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 上打印$1
在seen
中的那些行}。
答案 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