awk sep data แยกบรรทัดหลังตัวแปรบางตัว

ฉันมีไฟล์ขนาดใหญ่ที่มีรูปแบบปกติ

       snaps1:          Counter:             4966
        Opens:          Counter:           357283

     Instance:     s.1.aps.userDatabase.mount275668.attributes


       snaps1:          Counter:             0
        Opens:          Counter:           357283

     Instance:     s.1.aps.userDatabase.test.attributes

บรรทัดเหล่านี้ซ้ำกับบรรทัดอื่นๆ ด้านบนและด้านล่าง ฉันต้องพิมพ์บรรทัด snaps1 และรับ instance: line ด้วย ดังนั้นฉันต้องค้นหา snaps1 แต่เฉพาะในกรณีที่ตัวนับมากกว่า 0 แล้วจึงพิมพ์ snaps1 line และบรรทัดอินสแตนซ์ด้วย

ขออภัยไม่มีเบาะแสเกี่ยวกับวิธีการทำเช่นนี้? คุณช่วยได้ไหม?

จากบรรทัดด้านบน ฉันควรเห็นผลลัพธ์นี้

snaps1:          Counter:             4966
Instance:        s.1.aps.userDatabase.mount275668.attributes

ขอขอบคุณความช่วยเหลือใด ๆ ที่คุณสามารถให้ได้


person theuniverseisflat    schedule 23.11.2015    source แหล่งที่มา
comment
ขอบคุณเช่นกันและคำอธิบายรายละเอียดของคุณ   -  person theuniverseisflat    schedule 24.11.2015


คำตอบ (2)


ลองสิ่งนี้:

awk '/snaps1/ && $NF>0{print;f=1}f&&/Instance/{print;f=0}' file

เพื่อหลีกเลี่ยงช่องว่างที่ จุดเริ่มต้น ของบรรทัด:

awk '/snaps1/ && $NF>0{gsub(/^ */,"");print;f=1}
     f&&/Instance/    {gsub(/^ */,"");print;f=0}'  file

ผลลัพธ์

snaps1:          Counter:             4966
Instance:     s.1.aps.userDatabase.mount275668.attributes

คำอธิบาย

/snaps1/ && $NF>0 {gsub(/^ */,"");print;f=1} ใช้เพื่อตั้งค่า f ธง เมื่อพบรูปแบบ snaps1 และ ฟิลด์สุดท้าย NF ต้องมากกว่าหนึ่งช่อง เพื่อลบช่องว่างที่ไม่ต้องการและพิมพ์บรรทัดปัจจุบัน

หมายเหตุ /snaps1/ && $NF เป็นนิพจน์ที่เทียบเท่า เหตุผล: ค่าตัวเลข ใดๆ ยกเว้นศูนย์จะเป็น จริง สำหรับ awk

f&&/Instance/ {gsub(/^ */,"");print;f=0} หาก f flag เป็น True (1) และ Instance พบรูปแบบ ให้พิมพ์บรรทัดปัจจุบัน (ลบช่องว่างที่ไม่ต้องการ) และตั้งค่าสถานะกลับเป็น false

person Juan Diego Godoy Robles    schedule 23.11.2015
comment
สวัสดีและขอบคุณ ฉันลองใช้คำสั่งของคุณแล้ว แต่ได้รับข้อผิดพลาดทางไวยากรณ์ใช่ไหม awk '/snaps1/{s=$0; c=$NF} /Instance/ && c{print s ORS $0}' adsmobout.21.37.59 awk: ข้อผิดพลาดทางไวยากรณ์ใกล้บรรทัด 1 awk: การประกันตัวใกล้บรรทัด 1 - person theuniverseisflat; 23.11.2015
comment
ขออภัยการตอบกลับล่าช้า / ล่าช้า - คำสั่งของคุณก็ใช้ได้เช่นกัน ฉันขอโทษฉันกำลังพยายามเข้าใจวิธีการทำงาน.... - person theuniverseisflat; 02.12.2015

person    schedule
comment
สวัสดี ฉันลองใช้คำสั่งของคุณเช่นกัน - ยังคงได้รับ awk: ข้อผิดพลาดทางไวยากรณ์ใกล้บรรทัด 1 awk: ประกันตัวใกล้บรรทัด 1 ฉันยังลองใช้ cat ไฟล์และ pip ​​คำสั่งมีข้อผิดพลาดเดียวกัน - person theuniverseisflat; 23.11.2015
comment
ข้อความแสดงข้อผิดพลาดนั้นเท่านั้นมาจาก awk เก่าที่ใช้งานไม่ได้ ซึ่งน่าเสียดายที่เป็น awk เริ่มต้นบน Solaris หากคุณอยู่บน Solaris ให้ใช้ /usr/xpg4/bin/awk (หรือใช้งานได้น้อยกว่าและไม่ใช่ POSIX แต่ nawk ก็ใช้ได้กับทุกสิ่งเช่นกัน) ในทุกระบบ ให้ลองรับ/ใช้งาน GNU awk หากเป็นไปได้ - person Ed Morton; 23.11.2015
comment
สวัสดี ขอบคุณสำหรับการตอบกลับอย่างรวดเร็ว - ฉันลองใช้ /usr/xpg4/bin/awk แล้ว และรันกับไฟล์ของฉัน และไม่มีผลลัพธ์ใดๆ เลย ฉันรู้ว่ามีบรรทัดอยู่ด้วย - person theuniverseisflat; 23.11.2015