วิธีการพิมพ์บรรทัดที่ 15 และ 25 ของแต่ละ 50 บรรทัด


9

ฉันมีไฟล์ขนาดใหญ่และฉันต้องการพิมพ์จากแต่ละลำดับ 50 บรรทัดที่15และวันที่ 25เส้น

sed -n '15,25p' inputfile

วิธีแก้ไขคำสั่งนี้เพื่อพิมพ์เฉพาะบรรทัดที่ 15 และ 25 และวนรอบแต่ละ 50 บรรทัดในไฟล์

คำตอบ:


22
awk 'NR % 50 == 15 || NR % 50 == 25'

จะเป็นวิธีพกพาที่ชัดเจน

หมายเหตุsedทางเลือกGNU :

sed '15~50b;25~50b;d'

ไม่sedว่าคุณจะทำอะไร:

sed -n 'n;n;n;n;n;n;n;n;n;n;n;n;n;n;p;n;n;n;n;n;n;n;n;n;n;p;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n'

(รับบรรทัดถัดไป 14 ครั้ง, พิมพ์, บรรทัดถัดไป 10 ครั้ง, พิมพ์, บรรทัดถัดไป 25 ครั้ง, กลับไปที่รอบถัดไป (ซึ่งคว้าบรรทัดพิเศษที่ขาดหายไปเพื่อสร้าง 50))


10

นี่คืองานสำหรับ awk

awk '(NR%50==15) || (NR%50==25)' inputfile

แก้ไข: ฉันเข้าใจผิดโดย sed คำสั่งใน OP


9

กับ perl

1) คล้ายกับawkโซลูชัน$.ตัวแปรเก็บหมายเลขบรรทัด

$ seq 135 | perl -ne 'print if $.%50==15 || $.%50==25'
15
25
65
75
115
125

2) ตรวจสอบรายชื่อหมายเลขบรรทัดง่ายต่อการขยาย

$ seq 135 | perl -ne 'print if grep {$_==$.%50} (15,25)'
15
25
65
75
115
125

$ seq 135 | perl -ne 'print if grep {$_==$.%50} (15,25,32)'
15
25
32
65
75
82
115
125
132

4

อีกวิธีที่ใช้ awk ตามแนวคิดของ Sundeep ในการใช้รายการ:

awk 'BEGIN { a[15] a[25] }; NR % 50 in a'

ตั้งค่าคีย์ในอาร์เรย์aตามบรรทัดที่คุณต้องการพิมพ์ พิมพ์บรรทัดที่NR % 50ตรงกับหนึ่งในคีย์ในอาร์เรย์


เพื่อบอกถึงประสิทธิภาพฉันได้จับเวลาวิธีนี้และเปรียบเทียบกับคำตอบอื่น ๆ โดยใช้เวลาโดยเฉลี่ยuserสำหรับการวิ่ง 3 ครั้ง

0.276s

$ time awk 'BEGIN { a[15] a[25] }; NR % 50 in a' <(seq 1000000) > /dev/null

0.374s

$ time awk 'NR % 50 == 15 || NR % 50 == 25' <(seq 1000000) > /dev/null

0.384s

$ time perl -ne 'print if $.%50==15 || $.%50==25' <(seq 1000000) > /dev/null

0.542s

$ time perl -ne 'print if grep {$_==$.%50} (15,25)' <(seq 1000000) > /dev/null
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.