awk打印问题

awk打印问题

我有一个代码,它从日志文件中获取值并将它们填充到 Excel 电子表格中:

function ltrim(s) { sub(/^[ \t]+/, "", s); return s }
function rtrim(s) { sub(/[ \t]+$/, "", s); return s }
function trim(s)  { return rtrim(ltrim(s)); }

function getfield( xml, fieldname) {
    i = index ( xml, "fieldName=\""fieldname"\"");
    if(i < 1){
      ts = "";
    }
    else{
       ts = substr( xml, i + length("fieldName=\""fieldname"\"") );
       ts = substr( ts, index( ts, "value=\"" ) + length( "value=\"" ) );
       ts = substr( ts, 1, index( ts, "\"")-1);
       gsub(/&amp;/, "&", ts );
       if ( index( ts, "," ) > 0 ) ts ="\""ts"\"";
    }
            return ts;
        }
BEGIN   { FS = "--------";OFS=",";}
 {sub(/..,[A-Z][A-Z]/, "CT-PT")}

        {
                orig = $0;
               # $7 = getfield(orig, "Modalities In Study");
                $9 = getfield(orig,"Subject Patients Sex");
                $10 = getfield(orig,"Modality Body Region");
                $11 = getfield(orig, "Patients Birth Date");
                $12 = getfield(orig, "Protocol Name");
                $13 = getfield(orig, "Timepoint ID");
                print;
         }

除了一件事之外,一切都运转良好。如果我将此打印语句放在代码中的任何位置,它就会在整个 Excel 电子表格中循环。所以基本上打印语句出现在每隔一行。我只希望它出现在第一行:

{print "Study Instance UID,Number of Series,Number of Instances, Exam Transfer Date,Exam Date,Subject Number,Modalities In Study,Upload Status,Subject Patients Sex,Modality Body Region,Patients Birth Date,Protocol Name,Timepoint"}

我不知道为什么会发生这种情况。我什至尝试将此行放在函数之后trim(s) { return rtrim(ltrim(s)); },但仍然在电子表格中循环。有谁有任何建议或可能知道为什么会发生这种情况?

答案1

除了函数之外,awk 代码看起来像

condition {actions}

如果{actions}块丢失,则条件返回 true 时的隐式操作为{print}

如果condition缺少,并且这与您的问题直接相关,则它隐式为真对于每一行输入的。这就是为什么你会多次打印该行。

您需要指定一个条件。按照 Stéphane 的建议,将 print 语句放在 BEGIN 块内,或者您可以这样做:

NR == 1 {print "this is the header"}

该操作仅在条件为真时发生,即第一行输入。

相关内容