wie man Linefeed in awk unterdrückt

Dec 04 2020

Ich konditioniere zwar ein awkSkript unten, aber es erzeugt viele unerwünschte LFs. Ich frage mich, wie ich die Ausgabe LFin diesem Skript unterdrücken (steuern) kann . Vielen Dank im Voraus für Ihren freundlichen Rat.

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

Der Inhalt der Datei (Datei) ist so etwas wie:

3,1
3,2

In diesem Fall ist die Ausgabe wie

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

Das ist sehr ungeschickt. Meine gewünschte Ausgabe ist wie:

1,1,100
1,0,50

Antworten

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

Besser lesbar:

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

Könnten Sie bitte versuchen, den Versuch von OP hier zu korrigieren. Korrigiert und getestet in 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

Korrekturen bei OP-Versuchen:

  • Die entfernte nfVariable wird nicht benötigt.
  • Wir müssen NICHT so schnell wie möglich drucken, wenn eine Bedingung erfüllt ist. Deshalb tritt bei der Ausgabe ein Problem auf. Stattdessen können wir Werte in den Feldern (z. B. -> 1. und 2. Feld) speichern und die Zeile zuletzt mit einer Variablen drucken.

Erläuterung: Hinzufügen einer detaillierten Erklärung für oben.

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

Man könnte sagen , AWKnicht nach jedem Newline zu setzen , printindem Sie ORSauf "", aber dann müssen Sie Newline sich selbst gestellt , wo nötig. Ihr Code wird möglicherweise folgendermaßen überarbeitet:

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

dann für den fileInhalt sein

3,1
3,2

es wird ausgegeben:

1,1,100
1,0,50

(getestet in gawk 4.2.1)