基本上我的代码遍历了整个文件,然后没有打印出最后两行,因为当它找不到另一个"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&C)
- 父和重复,如果都来自文件 A,或者只是重复,如果它的 AAB
- 父和重复,如果都来自文件 B,或者只是复制者,如果它的 ABB
所以我的 Bdupes 文件缺少两个伊莱恩,因为代码没有处理最后两行。
布杜普斯:
Gareth|B3|C|A3
什么时候应该是这个:
Gareth|B3|C|A3
Elaine|B6|P|
Elaine|B7|C|B6
我的代码基本上找到作为父 P 的第一条记录,但是当涉及到文件末尾时,它不会继续,因为没有"P"了。这就是为什么两个伊莱恩失踪的原因。
我现在需要知道如何让 AWK 处理最后两行?
蒂亚
您的代码看起来可以大大简化。 如果要避免执行这种重构,一个简单的解决方案是附加备用输入。 例如,您可以简单地将if( $3 == "P" )
更改为if ($3 == "P" || NR != FNR )
,并在第二个文件中运行awk,其中输入几乎被忽略。 (根据逻辑,不清楚您是否必须准备合理的输入或添加更多逻辑才能干净地终止,并且代码太丑陋,无法在不注意的情况下确定这一点。 这实际上(几乎)与将该代码块包装在 END 块中相同。 另一个不错的选择是使用用户定义的函数,并在看到"P"行和 END 块时调用它。
无论哪种方式,第一步都是重构代码。