วิธีระงับ linefeed ใน awk

Dec 04 2020

ในขณะที่ฉันกำลังพูดถึงawkสคริปต์ด้านล่าง แต่มันสร้างLFs ที่ไม่ต้องการมากมาย ฉันสงสัยว่าจะระงับ (ควบคุม) ผลลัพธ์ของLFสคริปต์นี้ได้อย่างไร ขอบคุณล่วงหน้าสำหรับคำแนะนำที่ดี

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

เนื้อหาของไฟล์ (ไฟล์) มีลักษณะดังนี้

3,1
3,2

ในกรณีนี้ผลลัพธ์จะเป็นเช่น

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

นั่นคือเงอะงะมาก ผลลัพธ์ที่ฉันต้องการคือ

1,1,100
1,0,50

คำตอบ

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

อ่านได้ดีขึ้น:

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

โปรดลองติดตามแก้ไขความพยายามของ OP ที่นี่ได้ไหม แก้ไขและทดสอบใน awkGNU

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

การแก้ไขในความพยายามของ OP:

  • nfไม่จำเป็นต้องถอดตัวแปรออก
  • เราไม่จำเป็นต้องพิมพ์โดยเร็วเพราะเงื่อนไขได้รับความพึงพอใจนั่นคือสาเหตุที่ทำให้เกิดปัญหา แต่เราสามารถบันทึกค่าลงในฟิลด์ (เช่น -> ฟิลด์ที่ 1 และ 2) และพิมพ์บรรทัดสุดท้ายด้วยตัวแปร

คำอธิบาย: การเพิ่มคำอธิบายโดยละเอียดสำหรับข้างต้น

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

คุณอาจบอกว่าAWKอย่าขึ้นบรรทัดใหม่หลังจากแต่ละรายการprintโดยตั้งค่าORSเป็น""แต่คุณต้องขึ้นบรรทัดใหม่เมื่อจำเป็น รหัสของคุณอาจได้รับการปรับปรุงใหม่ดังต่อไปนี้:

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

จากนั้นสำหรับfileเนื้อหา

3,1
3,2

มันจะส่งออก:

1,1,100
1,0,50

(ทดสอบใน gawk 4.2.1)