奇妙な印刷の問題

奇妙な印刷の問題

ログファイルから値を取得して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;
         }

1つを除いて、すべてがうまく機能します。この印刷ステートメントをコードの任意の場所に配置すると、Excelスプレッドシート全体が繰り返されます。したがって、デフォルトでは、printステートメントは他のすべての行に表示されます。私はそれが最初の行に現れることを望みます。

{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"}

これは、条件がtrueの場合、つまり入力の最初の行にのみ発生します。

関連情報