逐行匹配两个文件 - 没有键

时间:2014-05-14 00:12:43

标签: arrays awk

我有两个80,000多个记录长度相同的大文件。我需要逐行比较文件的前8个字符。文件一的第一行是与文件二的第一行比较。文件一的第二行与文件二的第二行相比较。

示例文件1

01234567blah blah1
11234567blah blah2
21234567blah blah3
31234567blah blah4

示例文件2

31234567blah nomatch
11234567matchme2
21234567matchme3
31234567matchme4

第2 - 4行应该匹配,但第1行不应该匹配。我的脚本将第1行与第4行匹配,但应与第1行进行比较。

awk '                                                        
FNR==NR {                                                  
a[substr($0,1,8)]=1;next                                       
        }                                                              
{if (a[substr($0,1,8)])print $0; else print "Not Found", $0;} 
'  $inputfile1  $inputfile2     >  $outputfile1               

谢谢。

3 个答案:

答案 0 :(得分:1)

对于逐行比较,您需要使用FNR变量作为键。尝试:

awk 'NR==FNR{a[FNR]=substr($1,1,8);next}{print (a[FNR]==substr($1,1,8)?$0:"Not Found")}' file1 file2
Not Found
11234567matchme2
21234567matchme3
31234567matchme4

答案 1 :(得分:0)

awk 'BEGIN{
  while(1){
    f=getline<"file1";
    if(f!=1)exit;
    a=substr($0,1,8);
    f=getline<"file2";
    if(f!=1)exit;
    b=substr($0,1,8);
    print a==b?$0:"Not Found"FS$0}}'

如果成功将子字符串存储在file1中,那么从a读取一行,如果成功将子字符串存储在file2中,则从b读取一行,然后检查是否{{1} }和a相等或不相同,并打印输出。

输出:

b

答案 2 :(得分:0)

如果某个文件中没有单个字符,则可以将其用作分隔符,例如示例中的:paste / awk组合:

paste -d: data data2 | awk -F: '{prefix=substr($1,1,8)!=substr($2,1,8) ? "Not Found"OFS : ""; print prefix $2}'
  • paste将每个文件的相应行连接到一行,并带有:分隔符
  • awk使用:分隔符
  • awk测试每个字段的前8个字符的匹配,并创建prefix
  • 当不匹配时,awk会打印出prefix的“未找到”(+ OFS)。