ฉันมีไฟล์ขนาดใหญ่และฉันต้องการพิมพ์จากแต่ละลำดับ 50 บรรทัดที่15และวันที่ 25เส้น
sed -n '15,25p' inputfile
วิธีแก้ไขคำสั่งนี้เพื่อพิมพ์เฉพาะบรรทัดที่ 15 และ 25 และวนรอบแต่ละ 50 บรรทัดในไฟล์
ฉันมีไฟล์ขนาดใหญ่และฉันต้องการพิมพ์จากแต่ละลำดับ 50 บรรทัดที่15และวันที่ 25เส้น
sed -n '15,25p' inputfile
วิธีแก้ไขคำสั่งนี้เพื่อพิมพ์เฉพาะบรรทัดที่ 15 และ 25 และวนรอบแต่ละ 50 บรรทัดในไฟล์
คำตอบ:
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))
นี่คืองานสำหรับ awk
awk '(NR%50==15) || (NR%50==25)' inputfile
แก้ไข: ฉันเข้าใจผิดโดย sed คำสั่งใน OP
กับ 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
อีกวิธีที่ใช้ 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