jak powstrzymać wysunięcie wiersza w awk

Dec 04 2020

Chociaż awkponiżej przedstawiam jakiś skrypt, ale generuje on wiele niechcianych plików LF. Zastanawiam się, jak stłumić (kontrolować) wyjście LFw tym skrypcie. Z góry dziękuję za miłą radę.

awk '
BEGIN{
    FS=OFS=","
}
{
    nf=NF
    s=0 # initialization
        if($1==3){print "1,"; s+=50}else{print "0,"} if($2==1){print "1,"; s+=50}else{print "0,"}
        print s
        print ","
}END{}' file

Zawartość pliku (pliku) to coś w rodzaju:

3,1
3,2

W tym przypadku wynik jest podobny

1,
1,
100
,
1,
0,
50
,

To jest bardzo niezdarne. Moje pożądane wyjście to:

1,1,100
1,0,50

Odpowiedzi

3 AkshayHegde Dec 04 2020 at 13:00
$ cat input 3,1 3,2 $ awk 'BEGIN{FS=OFS=","}{c1=c2=sum=0;}$1==3{c1=1;sum+=50}$2==1{c2=1;sum+=50}{print c1,c2,sum}' input 
1,1,100
1,0,50

Lepiej czytelny:

awk 'BEGIN{
       FS=OFS=","
     }
     {
        c1=c2=sum=0;          # reset variables
     }
     $1==3{ # if col1 equal to 3 then c1=1; sum+=50 } $2==1{                    # if col2 equal to 1 then
       c2=1;
       sum+=50
    }
    {
        print c1,c2,sum       # print variables 
    }' input    
3 RavinderSingh13 Dec 04 2020 at 12:55

Czy możesz spróbować podążać za, naprawiając próbę OP tutaj. Poprawione i przetestowane w GNU awk.

awk '
BEGIN{
    FS=OFS=","
}
{
   s=0
   if($1==3){s+=50;$1="1"} else{$1="0"} if($2==1){s+=50;$1="1"} else{$2="0"}
   print $0,s
}' Input_file

Poprawki w próbach OP:

  • Usunięta nfzmienna nie jest potrzebna.
  • NIE musimy drukować tak szybko, jak tylko warunek zostanie spełniony, dlatego na wyjściu pojawia się problem, zamiast tego możemy zapisać wartości do pól (np. -> pierwsze i drugie pola) i wypisać na końcu wiersz ze zmienną.

Wyjaśnienie: dodanie szczegółowego wyjaśnienia powyższego.

awk '                                       ##Starting awk program from here.
BEGIN{                                      ##Starting BEGIN section of this program from here.
    FS=OFS=","                              ##Setting FS and OFS as comma here.
}
{
   s=0                                      ##Setting s as 0 here.
   if($1==3){s+=50;$1="1"} else{$1="0"}     ##Checking if 1st field is 3 then add 50 to s and set 1 to $1 else keep $1 as 0 here.
   if($2==1){s+=50;$1="1"} else{$2="0"} ##Checking if 2nd field is 3 then add 50 to s and set 1 to $2 else keep $2 as 0 here. print $0,s                               ##Printing line and value of s here.
}' Input_file                               ##mentioning Input_file name here.
Daweo Dec 04 2020 at 16:19

Możesz powiedzieć, AWKaby nie wstawiać znaku nowej linii po każdym print, ustawiając ORSna "", ale wtedy musisz sam wstawić znak nowej linii tam, gdzie jest to potrzebne. Twój kod może zostać przerobiony w następujący sposób:

awk '
BEGIN{
    ORS="";FS=OFS=","
}
{
    nf=NF
    s=0 # initialization
        if($1==3){print "1,"; s+=50}else{print "0,"} if($2==1){print "1,"; s+=50}else{print "0,"}
        print s
        print "\n"
}END{}' file

potem dla filezadowolenia

3,1
3,2

wyświetli:

1,1,100
1,0,50

(testowane w gawk 4.2.1)