Awk problema de impressão

3

Eu tenho um código que recebe valores de um arquivo de log e os preenche em uma planilha do 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;
         }

Tudo está funcionando bem, exceto por uma coisa. Se eu colocar esta declaração print em qualquer lugar no código, ela faz um loop em toda a planilha do Excel. Então, basicamente, a declaração de impressão aparece em todas as outras linhas. Eu só quero que apareça na primeira linha:

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

Não sei por que isso ocorre. Eu até tentei colocar essa linha logo após a função trim(s) { return rtrim(ltrim(s)); } , mas ainda mantém o loop na planilha. Alguém tem alguma sugestão ou pode saber porque isso ocorre?

    
por ryekayo 01.07.2014 / 15:37

1 resposta

7

Além das funções, o código awk parece

condition {actions}

Se o bloco {actions} estiver ausente, a ação implícita, se a condição retornar true, será {print} .

Se o condition estiver faltando, e isso está diretamente relacionado à sua pergunta, é implicitamente verdadeiro para cada linha da entrada. É por isso que você imprime essa linha tantas vezes.

Você precisa especificar uma condição. Coloque o comando print dentro do bloco BEGIN, como Stéphane sugere, ou você pode fazer isso:

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

Essa ação só ocorre quando a condição é verdadeira, o que é para a primeira linha de entrada.

    
por 01.07.2014 / 15:57

Tags