2017-01-16 2 views
0

я получил некоторые проблемы с этим основные данные:AWK - использование элемента на следующей записи GETLINE?

DP;DG 
67; 
    ;10 
    ;14 
    ;14 
    ;18 
    ;18 
    ;22 
    ;65 
68; 
    ;0 
    ;9 
    ;25 
    ;25 
70; 

, что я хотел бы преобразовать на этот вид продукции:

DP;DG 
67; 
    ;10 
    ;14 
    ;14 
    ;18 
    ;18 
    ;22 
    ;65;x 
68; 
    ;0 
    ;9 
    ;25 
    ;25;x 
70; 

Значение «х» приходит, если на следующей строке $ 1 существует, или если $ 2 является нулевым. По моему мнению, я должен использовать getline, но я не понимаю! Я попытался следующий код:

#!/bin/bash 

file2=tmp.csv 
file3=fin.csv 

awk 'BEGIN {FS=OFS=";"} 

{ 
    print $0; 
    getline; 
    if($2="") {print $0";x"} 
    else {print $0} 

}' $file2 > $file3 

Показалось легко. Я не упоминаю результат, полностью отличный от моих ожиданий.

Некоторые подсказки? Необходима ли линия для этой проблемы?

ОК, я продолжаю тестировать код:

#!/bin/bash 

file2=tmp.csv 
file3=fin.csv 

awk 'BEGIN {FS=OFS=";"} 

{ 
    getline var 
    if (var ~ /.*;$/) { 
     print $0";x"; 
     print var; 
     } 
    else { 
     print $0; 
     print var; 
     } 

}' $file2 > $file3 

Это довольно лучше, но все же, все линии, которые должны быть отмечены не ... Я не понимаю, почему ...

+0

«Из моего понимания, я должен использовать getline'. Нет, прочитайте «Эффективное программирование Awk», 4-е издание, Арнольд Роббинс, чтобы узнать, как использовать awk и читать http://awk.freeshell.org/AllAboutGetline, чтобы узнать несколько раз, когда уместно использовать getline и все оговорки и причины, к. –

ответ

1

альтернативный вариант с одним проходом

$ awk -F\; 'NR>1 {printf "%s\n", (f && $2<0?"x":"")} 
       {f=$1<0; printf "%s", $0} 
      END {print ""}' file 
+0

Я думаю, что OP хочет x, когда '$ 2 <0' на следующей строке, и должен храниться в булевом' f'as well. Подход печати 'x \ n' при обработке второй строки является умным и делает мой (не опубликованный) подход' tac | awk ... | tac' смешно. Обратите внимание, что иногда вы хотите добавить '; x \ n'. –

1

придают этому однострочник попробовать:

awk -F';' 'NR==FNR{if($1>0||!$2)a[NR-1];next}FNR in a{$0=$0";x"}7' file file 

или

awk -F';' 'NR==FNR{if($1~/\S/||$2).....