วิธีการลบแถว (บรรทัด) ด้วย AWK


9

ฉันพยายามหาวิธีที่ฉันสามารถใช้AWKเพื่อลบบรรทัด ตัวอย่างเช่นสมมติว่าไฟล์อินพุตคือ:

30
20

ผลลัพธ์จะเป็น:

10

ตอนนี้เป็นการทดสอบฉันพยายามคำนวณคอลัมน์หน่วยความจำ "ใช้แล้ว" จาก:

$ cat /proc/meminfo

ดังนั้นในขณะนี้ฉันได้เขียนสิ่งนี้:

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    -- Here comes the calculation using AWK

ฉันได้ลองทำสิ่งต่อไปนี้แล้ว:

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}' | awk '{$0-s}{s=$0} END {print s}' 

แต่นี่เป็นเพียงแถวสุดท้ายของข้อมูล

ฉันพบวิธีแก้ไขปัญหาการทำงาน แต่ฉันสงสัยว่าเป็นวิธีที่ดีที่สุด ประสบการณ์การเขียนโค้ดทั้งหมดของฉันบอกฉันว่าการเข้ารหัสฮาร์ดจำนวนแถวนั้นแย่มาก: P

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}' | awk 'NR == 1{s=$0} NR == 2 {s=s-$0} END {print s}'

คุณต้องการทำอะไรกับแถว N แถว ผลลัพธ์สุดท้ายควรเป็น line1_$2 - line2_$2 - lineN-$2อย่างไร คุณต้องการที่จะลบสองแถวแรกติดกันหรือไม่
terdon

คำตอบ:


9

นอกจากนี้คุณยังสามารถทำเช่นนี้โดยใช้awk, และpaste bcฉันพบว่าวิธีนี้ง่ายต่อการจดจำไวยากรณ์ของการawkกำหนดให้ฉันค้นหาสิ่งต่าง ๆ เสมอเพื่อยืนยัน

หมายเหตุ:วิธีการนี้มีข้อดีของความสามารถในการแข่งขันกับเอาต์พุตหลายบรรทัดการลบหมายเลข 2, 3, 4 และอื่น ๆ จากหมายเลข 1

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}' | paste -sd- - | bc
7513404

รายละเอียด

ด้านบนใช้awkในการเลือกคอลัมน์ที่มีตัวเลขที่เราต้องการลบ

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}'
7969084
408432

จากนั้นเราจะใช้pasteเพื่อรวมค่า 2 ค่าเหล่านี้และเพิ่มเครื่องหมายลบระหว่างค่าเหล่านั้น

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}'| paste -sd- -
7969084-346660

เมื่อเราผ่านสิ่งนี้ไปbcก็จะทำการคำนวณ

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}'| paste -sd- - | bc
7513404

@terdon - ขอบคุณฉันทำการแก้ไขนั้นเมื่อคุณทำมัน 8-)
slm

3

วิธีการแก้ปัญหา awk หมดจดไม่มีคำสั่ง cat หรือ grep ซ้ำซ้อน:

awk '/MemTotal/ {TOT=$2} /MemFree/ {FREE=$2} END {printf("%d kB Used\n", TOT-FREE)}' /proc/meminfo

ฉันเห็น awk_FTW เอาชนะฉันไปได้ แต่ฉันแม้ว่าการจัดรูปแบบผลลัพธ์อาจดี


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