文件结束问题。如何确保它读取最后一行AWK

时间:2013-09-06 14:48:50

标签: awk

基本上我的代码遍历整个文件然后不会打印出最后两行,因为当它找不到另一行'P'时没有任何东西可以保持它 这是我的代码:

BEGIN{

FS= "|"
countA=CountB=0;

}

{

id=substr($2,1,1);
++file[id]




if ($3 == "P"){
#      print "message 1", countB, countA;

  if(countB==0){
    for(dupes in B){
      print B[dupes] > "Bdupes.txt"

      print dupesB[dupes];
      print "ouputted logs for B";
      }
    }

  else if(countA==0){
    for(dupes in A){
      print A[dupes] > "Adupes.txt"
      }
    }

  else if(countA==countB){
    i=1
    while(i<countA){

      print A[i] > "mixdupes.txt"
      print B[i] > "mixdupes.txt"
      i++;
      }
    }
  else if(countA<countB && countA!=0){

    i=1
    while(i<(countA+1)){
      print A[i] > "mixdupes.txt"
      print B[i] > "mixdupes.txt"
      i++;
      }



    i=countA+1
    while(i<(countB+1)){
      print B[i] > "Bdupes.txt"
      i++;
      }
    }
  else if(countB<countA && countB!=0){
    i=1
    k=countB + 1;
    while(i<k){
      print A[i] > "mixdupes.txt"
      print B[i] > "mixdupes.txt"
      i++;
      }

    j=countB+1

    while(j<(countA+1)){
      print A[j] > "Adupes.txt"
      j++;
      }
    }


  if(id == "A"){
    A[1]=$0
    countA=1;
    countB=0;

    }

  else if (id == "B"){
    B[1]=$0
    countA=0;
    countB=1;
    }



  }
else if($3 == "C"){

  if(id=="A"){
    countA++;
    A[countA]=$0
    }

  else if(id == "B"){
    countB++;
    B[countB]=$0
    }
  }

else if($3 == "U"){

  print $0 > id "unique.txt";
  }

}



END{



for (file_id in file)
print file_id ":", file[file_id]

}

这是我的档案:

Name|ID|DDStatus|ParentID
Jon|A4|U|
Bob|B5|U|
Phil|A5|P|
Phil|B4|C|A5
Amy|A1|P|
Amy|A2|C|A1
Amy|B1|C|A1
Gareth|A3|P|
Gareth|B2|C|A3
Gareth|B3|C|A3
Elaine|B6|P|
Elaine|B7|C|B6

所以我的代码错过了最后两个:

 Elaine|B6|P|
 Elaine|B7|C|B6

因为在此之后它找不到另一个'P'。无论如何我可以确保它在我的END程序之后可能正确到底吗? 我想要5个文件。

  • 一个显示文件A中的唯一行。(你可以告诉它 来自ID字段开头的文件A / B.
  • 显示文件B中唯一行的一个
  • 父母与子女来自A + B(P&amp; C)的儿童
  • 家长&amp;如果来自文件A或仅仅是dupes(如果它的AAB
  • ),则为Dupes
  • 家长&amp;如果来自文件B,或者只是杜比(如果是ABB)
  • ,则为Dupes

所以我的Bdupes文件缺少两个Elaines,因为代码没有处理最后两行。

Bdupes:

Gareth|B3|C|A3

应该如此:

Gareth|B3|C|A3
Elaine|B6|P|
Elaine|B7|C|B6

我的代码基本上找到了作为父P的第一条记录,但是当它到达文件的末尾时它不会继续,因为没有'P''。这就是为什么两个Elaines失踪的原因。

我现在需要知道如何让AWK处理最后两行?

TIA

1 个答案:

答案 0 :(得分:1)

您的代码看起来可以大大简化。如果您想避免进行重构,一个简单的解决方案是附加备用输入。例如,您可以简单地将if( $3 == "P" )更改为if ($3 == "P" || NR != FNR )并在第二个文件上运行awk,其中输入通常被忽略。 (根据逻辑,你不清楚你是否需要做出合理的输入或添加更多的逻辑来干净地终止,并且代码太难以确定没有注意了。)这是有效的(几乎)与在END块中包装该代码块相同。另一个不错的选择是使用用户定义的函数,并在看到&#39; P&#39;行和END块。

无论哪种方式,您的第一步是重构您的代码。