อ่านช่วงของบรรทัดที่ระบุจากไฟล์


15

ฉันมีไฟล์ของฉันที่มี 100000 บรรทัดวิธีฉันจะได้รับบรรทัดจากบรรทัด # 5555 ถึงบรรทัด # 7777 ภายใต้ลินุกซ์

ขอบคุณสำหรับทุกอย่าง.

linux  files  sed 

1
@ibrahim พิจารณายอมรับคำตอบของไคล์ (โดยฟ้องเครื่องหมายถูกสีเขียวบนซ้าย) ถ้ามันช่วยให้คุณ
Jonik

คุณอาจแม่นยำถ้าคุณต้องการใช้ sed หรือเครื่องมืออื่น ๆ ก็โอเค
มนู H

การวิจัยนิดหน่อยโยนอย่างน้อยstackoverflow.com/questions/83329/…
sancho.s Reinstate Monica

คำตอบ:


22
sed '5555,7777!d' <filename>

นี่จะพิมพ์บรรทัด 5555-7777 ของไฟล์โดยรวม

เดนนิสโพสต์ต่อไปนี้ซึ่งฉันเห็นด้วยควรจะเร็วกว่า:

sed '5555,7777p; 7778q' filename

หลักฐานต่อไปนี้ที่ควรจะเร็วกว่า:

$ n=1
$ while [[ n -le 100000 ]]; do echo $n >> sedtest2; n=$((n + 1)); done
$ strace -e trace=read -o sed1 sed '5555,7777!d' sedtest2
$ strace -e trace=read -o sed2 sed '5555,7777p; 7778q' sedtest2
$ wc -l sed1
149 sed1
$ wc -l sed2
14 sed1

ใน Bash เท่านั้น (เพื่อความสนุกสนาน):

n=1
while read line; do 
    if [[ ($n -ge 5555) && ($n -le 7777)  ]]; then 
        echo $line
    elif [[ $n -gt 7777 ]]; then
        break
    fi 
    n=$(( $n + 1 ))
done < file

ฉันคิดว่าคุณ$n -gt 3ควรจะเป็น 7777 หรือเปล่า? นอกจากนี้คุณยังสามารถทำได้if (( n >= 5555 ))กับผู้ให้บริการเปรียบเทียบตัวเลขที่ดูเป็นธรรมชาติมากขึ้น (และความสามารถในการละทิ้งเครื่องหมายดอลลาร์) ((n++))และคุณสามารถทำ
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป


7

สิ่งเหล่านี้ควรได้ผล

  • sed -n ' startnumber , หมายเลข p'
  • awk 'NR> = ไฟล์ startnumber && NR <= endnumber '

คำถามยอดเยี่ยมโดยวิธี;)


1

ฉันพบว่าตัวเลือก sed ไม่ทำงานบนไฟล์ mysqldump ฉันเดาว่าเนื่องจากการจัดการกับตัวดึงข้อมูลบรรทัดหรืออักขระหลายไบต์ ตัดส่วนหัวและหางโดยใช้หมายเลขบรรทัดเดียวกับ grep ซึ่งเป็นสิ่งที่ฉันต้องการ ในการรับบรรทัด $ j ถึง $ k คุณต้อง:

x=$(( $k - $j + 1 ))
tail -n +$j filename | head -${x} 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.