如果满足条件,AWK会打印两次

时间:2017-05-17 21:19:48

标签: bash awk gawk awk-formatting

我在写一个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  

2 个答案:

答案 0 :(得分:2)

使用GNU awk for gensub()和\ s / \ S:

$ 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

答案 1 :(得分:0)

您可以使用以下awk脚本。 (P.S。输入文件中有前导和尾随空格。这就是为什么我必须使用NF&gt; 2&amp;&amp; NF&lt; = 5而不是NF == 3。)

TableModelListener