简体   繁体   中英

AWK - using element on next record GETLINE?

I got some problem with this basic data:

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

that I'd like to transform on this kind of output:

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

The "x" value comes if on the next line $1 exists or if $2 is null. From my understanding, I've to use getline but I don't get the way! I've tried the following code:

#!/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

Seemed easy. I don't mention the result, totally different from my expectation.

Some clue? Is getline necessary on this problem?

OK, I continue to test some code:

#!/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

It's quite better, but still, all lines that should be marked aren't... I don't get why...

give this one-liner a try:

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

or

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

alternative one pass version

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM