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

文件结束问题。如何确保它读取最后一行AWK,awk,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

基本上,我的代码会遍历整个文件,然后不会打印出最后两行,因为当它找不到另一个“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]

}
所以我的代码漏掉了最后两个,所以:

 Elaine|B6|P|
 Elaine|B7|C|B6
因为在此之后找不到另一个“p”。不管怎样,我能确保它一直到最后吗?也许是在我的结束程序之后? 我想要5个文件

  • 显示文件A中唯一行的一个。(您可以告诉它的 从文件A/B的ID字段开始
  • 显示文件B中唯一行的代码
  • A+B(P&C)的父母和子女
  • 父级复制(如果两者都来自文件A)或仅复制(如果是AAB)
  • 父级&如果都来自文件B,则复制,如果是ABB,则仅复制
因此,我的Bdupes文件缺少两个elaine,因为代码没有处理最后两行

Bdupes:

Gareth|B3|C|A3
什么时候应该是这样:

Gareth|B3|C|A3
Elaine|B6|P|
Elaine|B7|C|B6
我的代码基本上会找到第一条记录,它是父p,但当它到达文件末尾时,它不会继续运行,因为没有剩下“p”。这就是两条elaine丢失的原因

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


TIA

您的代码看起来可以大大简化。如果您想避免进行重构,一个简单的解决方案是附加备用输入。例如,您可以简单地将
If($3==“p”)
更改为
If($3==“p”| NR!=FNR)
并在第二个文件上运行awk,其中输入大部分被忽略。(根据逻辑,不清楚您是否需要编写合理的输入或添加更多逻辑以干净地终止,代码太难看,无法在不注意的情况下确定。)这是有效的(几乎)与将代码块包装在结束块中相同。另一个不错的选择是使用用户定义的函数,并在看到结束块中的“P”行时调用它


不管怎样,你的第一步就是重构你的代码。

TL;DR-嗯,不完全是这样,但是代码很长,布局也不吸引人,而且没有关于逻辑应该做什么的解释,所以很难判断它做错了什么。要得到答案,你必须问一个可以回答的问题,也就是说,部分解释如果只是为了避免错误,请回顾一下如何创建SSCCE()。您得到了什么输出?您想要什么输出?我已经编辑了这个问题。希望我已经说得更清楚了?TIA Amy
Gareth|B3|C|A3
Elaine|B6|P|
Elaine|B7|C|B6