ลบบรรทัดว่างในหน้าจอ awk


10

ผมพยายามที่จะคิดออกวิธีการแก้ปัญหาหานี้คำถาม ฉันต้องการที่จะใช้awkสำหรับการแก้ปัญหา

ไฟล์อินพุตของฉันเป็นดังนี้

-bash-3.2$ cat file
ramesh
ramesh_venkat
ramesh3_venkat3
ramesh4
ramesh5
venkat
venkat3
venkat4

ฉันใช้awkคำสั่งเพื่อแยกค่าที่สองหลังจาก_ดังต่อไปนี้

awk -F "_" '{print $2}' file

อย่างไรก็ตามแม้ว่าคำสั่งข้างต้นจะพิมพ์ค่าที่ถูกต้องฉันได้รับบรรทัดว่างในผลลัพธ์ของฉัน ฉันมี 2 คำถาม

คำถามที่ 1

ฉันจะลบบรรทัดว่างในผลลัพธ์เพื่อให้ได้เฉพาะvenkatและvenkat3ในผลลัพธ์ได้อย่างไร

ถ้าฉันใช้printfแทนที่จะเป็นของprintฉันawkฉันจะได้venkatvenkat3ผลลัพธ์ที่ฉันไม่ต้องการบรรลุ ฉันต้องการผลลัพธ์เช่น

venkat
venkat3

คำถามที่ 2

การใช้ค่าเหล่านั้นเป็นอาเรย์แบบเชื่อมโยงหรือบางอย่างฉันจะค้นหาว่าค่านั้นเกิดขึ้นจริงใน$1คอลัมน์ได้อย่างไร

ฉันต้องการที่จะบรรลุสิ่งที่ต้องการ

awk -F "_" '$2==1{print $1}' file

แก้ไข

ฉันไม่ได้สังเกตawkวิธีแก้ปัญหาของ Stephane มันทำในสิ่งเดียวกันกับที่ฉันได้พูดไปรึเปล่า?


1
สเตฟานawkไม่ได้ทำในสิ่งเดียวกัน _วิธีการของคุณสันนิษฐานว่าคำเท่านั้นที่สามารถที่มีอยู่ในอีกหากมีการแยกออกจากกัน ในขณะที่เป็นจริงเช่น OP ของทุกคำตอบที่โพสต์ยังจัดการกับกรณีเช่นและไม่เพียง แต่doglion dog_lion
terdon

คำตอบ:


8

คำถามที่ 1

$ awk -F _ 'NF > 1 {print $2}' file
venkat
venkat3

Question2

$ awk -F _ '
    NR == FNR {a[$1];next}
    ($2 in a) {print $2}
' file file
venkat
venkat3

ฉันต้องการที่จะแสดงvenkatและvenkat3ตาม OP ถามในคำถามอื่น ๆ ฉันกำลังพยายามหาว่ากุญแจหลังจากนั้น_มีอยู่ใน$1คอลัมน์ของฉัน
Ramesh

โอ้ฉันได้อัพเดทคำตอบแล้ว!
cuonglm

ทางออกที่ดี ฉันคิดว่าคุณควรจะเพิ่มคนนี้ยังรวมถึงวิธีการแก้ปัญหาของคุณในคำถามอื่น ๆ :)
Ramesh

8

สำหรับคำถามที่ 1 คุณสามารถใช้ตัวเลือก--only-delimited( -s) ของcut

cut -s -f2 -d'_' file
venkat
venkat3

8

วิธีอื่น:

คำถามที่ 1

awk -F_ '$2{print $2}' file

จะพิมพ์เฉพาะเมื่อ$2มีการกำหนด มันเป็นวิธีการเขียนที่สั้นกว่า:

awk -F_ '{if($2){print $2}}' file

คำถามที่ 2

ไม่มีอะไรเพิ่มที่ยังไม่ได้รับการแก้ไข


1
ทางออกที่ดีสำหรับคำถาม 1 สั้นและกรอบ :)
Ramesh

6

คำถามที่ 1

awk -F "_" '/_/ {print $2}' file

คำถามที่ 2

awk -F "_" '{values[$1]=1;}; END {for (val in values) print val;}' file

ทางออกที่ดี ฉันชอบ :)
Ramesh

สำหรับ question2 ผมตั้งใจที่จะได้รับเพียงvenkatและเป็นผลผลิตที่พวกเขามีอยู่ในปัจจุบันvenkat3 $1อย่างไรก็ตามฉันได้รับ$1ค่าทั้งหมดตามคำสั่งของคุณ
Ramesh

@Ramesh: ตามคำอธิบายของคุณฉันคิดว่าคุณต้องการรับ$2รายการที่$2เกิดขึ้นในคอลัมน์ที่ 1 ถูกต้องหรือไม่
cuonglm

@Gnouc ใช่คุณพูดถูก
Ramesh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.