AWK вывести группу строк дважды, если выполнены условия

У меня возникают трудности при написании оператора 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 ответа

Решение

С GNU awk для 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

Вы можете использовать следующий скрипт 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;
    }
}
Другие вопросы по тегам