簡體   English   中英

如果滿足條件,則AWK將行組打印兩次

[英]AWK print group of lines twice if conditions met

我在編寫AWK語句時遇到困難,該語句將在指定條件下兩次打印出一組行,並且可以選擇重復更改行中的值。 例如,如果一行的第一個字段是11($ 1 = 11),那么我想打印出該行和隨后的行兩次(調整第二列中的值($ 2)。

到目前為止,這就是我所擁有的,但是它不會復制第一個字段=到11的行以及下一行。

awk '{if(NF<3) print $0; if(NF==3 && $1==11) print $0, 1, 20; if(NF==3 && $1 != 11) print $0, 0, 0; if(NF>3) print $0;}'

輸入示例

1 3
            6 0.1 99 
              0.100 0.110 0.111 
            7 0.4 88 
              0.200 0.220 0.222
           11 0.5 77
              0.300 0.330 0.333 
2 2
            7 0.3 66
              0.400 0.440 0.444 
           11 0.7 55
              0.500 0.550 0.555  

這是我想做的事情的簡化版本,所以為了簡單起見,我希望打印的NR其中$ 1 == 11並在下一行(NR + 1)的第二列($ 2)中的值是原始值的一半。 例如,對於1 3部分下的行分組,11之后的值為0.5。 理想情況下,打印出的行的值將在11之后為0.25。

理想輸出

1 3
                6 0.1 99 0 0
                  0.100 0.110 0.111 
                7 0.4 88 0 0
                  0.200 0.220 0.222
               11 0.25 77 1 20
                  0.300 0.330 0.333 
               11 0.25 77 1 20 
                  0.300 0.330 0.333 
2 2
                7 0.3 66 0 0
                  0.400 0.440 0.444 
               11 0.35 55 1 20
                  0.500 0.550 0.555  
               11 0.35 55 1 20
                  0.500 0.550 0.555  

對於gensub()和\\ s / \\ S,使用GNU awk:

$ awk '$1==11{$0=gensub(/^(\s+\S+\s+)\S+/,"\\1"$2/2,1); c=2; s=$0} {print} c&&!--c{print s ORS $0}' file
1 3
            6 0.1 99
              0.100 0.110 0.111
            7 0.4 88
              0.200 0.220 0.222
           11 0.25 77
              0.300 0.330 0.333
           11 0.25 77
              0.300 0.330 0.333
2 2
            7 0.3 66
              0.400 0.440 0.444
           11 0.35 55
              0.500 0.550 0.555
           11 0.35 55
              0.500 0.550 0.555

您可以使用以下awk腳本。 (PS在您的輸入文件中有前導和尾隨空格。這就是為什么我不得不使用NF> 2 && NF <= 5而不是NF == 3的原因。)

BEGIN {
    c=0;FS="[ \t]+";OFS=" ";x="";y="";
}
c==2{
    print x, 1, 20;
    print y;
    c=0;
}
NF ==2{
    print $0;
}
NF>2 && NF<=5{
    if(c==1){
        print $0;
        y=$0;c=2;next;
    }
    if($2==11){
        print $0, 1, 20;
        x=$0;c=1;
    }
    else print $0;

}
NF>5{
    print $0,"hello";
}
END{
    if(c==2){
        print x, 1, 20;
        print y;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM