ลบ n บรรทัดแรกของไฟล์ข้อความขนาดใหญ่


63

ฉันต้องลบ 42 บรรทัดแรกของดัมพ์ SQL 2GB

ฉันรู้ว่าฉันสามารถดูบรรทัดแรกโดยใช้:

head -n 44 dump.sql

แต่จะมีการแก้ไขหรือลบต่อไปหรือไม่

คำตอบ:


91

หากคุณต้องการดูบรรทัดจาก 43 บนคุณสามารถใช้

tail -n +43 dump.sql

+สัญญาณเป็นสิ่งสำคัญ - ไม่ว่าtailจะพิมพ์สุดท้าย 43 สายแทน อีกทางเลือกหนึ่งด้วย 'sed'

sed 1,42d dump.sql

หากคุณต้องการลบ 42 บรรทัดแรกจากไฟล์ต้นฉบับคุณสามารถทำการเปลี่ยนแปลงภายใน-iตัวเลือกได้

sed -i 1,42d dump.sql

tailคำตอบที่น่ากลัวใช้งานที่ยอดเยี่ยมของ ฉันพบสิ่งใหม่หลายครั้งที่จะเรียนรู้จากคำตอบของคุณ ขอบคุณ
souravc

1
โอ้ man tail -n +43 เป็นตัวเปลี่ยนเกม! ฉันใช้การร้องขอที่ไม่เหมาะสมของ sed เพื่อให้ได้ผลเหมือนกัน
pfctdayelise

4
ถ้าคุณไม่มีที่ว่างเหลืออยู่ในอุปกรณ์ล่ะ? sed -i 1,50000000d 17GigFileสร้างไฟล์ temp sedXYZที่ใช้กิกะไบต์มากขึ้น มีวิธีการที่ไม่มีไฟล์ temp หรือไม่
juanmf

ความแตกต่างระหว่างtail -n +43และhead -n 44ตามที่กล่าวถึงในคำถามคืออะไร?
Hashim

@juanmf คุณอาจจะพยายามที่จะทำเช่นนี้ด้วยเครื่องมือแบบ GUI (ผมเคยทำมันโดยใช้ Mousepad แต่ไฟล์ที่น่าสนใจคือ "เท่านั้น" ~ 700MB ใช้เวลาสักครู่สำหรับไฟล์ที่จะโหลด แต่ ... .
ขุด

18

นี่เป็นวิธีที่ง่ายที่สุด:

sed '1,42d' test.sql > test2.sql

ลบบรรทัด 1-42 ออกจาก test.sql และบันทึกเป็น test2.sql


9
ไฟล์ที่สั้นกว่าน่าจะเป็นsed -i '1,42d' test.sqlหากคุณไม่ต้องการเก็บไฟล์ต้นฉบับไว้
Sadi


3

คุณสามารถใช้ Vim ในโหมด Ex:

ex -s -c '1d42|x' dump.sql
  1. 1 ย้ายไปที่บรรทัดแรก

  2. 42 เลือก 42 บรรทัด

  3. d ลบ

  4. x บันทึกและปิด


1
มันสร้างไฟล์ชั่วคราวหรือไม่? เป็นไปได้ไหมที่จะทำเช่นนี้เมื่อพื้นที่ที่เหลือบนอุปกรณ์น้อยกว่าขนาดไฟล์
juanmf

2
@juanmf โซลูชันทั้งหมดเหล่านี้ต้องการไฟล์ชั่วคราว เป็นไปได้ที่จะลบข้อมูลออกจากจุดสิ้นสุดของไฟล์โดยไม่ต้องใช้ไฟล์ชั่วคราว
PerlDuck

0

ขออภัยฉันไม่สามารถให้รหัสจริงแก่คุณได้ในขณะนี้ อย่างไรก็ตามลองดูสิ่งที่อยู่ในแนวของ

tail -n arcv(`wc -l`) -44

สิ่งที่ควรทำ (เมื่อจัดรูปแบบอย่างถูกต้อง) จะนับจำนวนบรรทัดในไฟล์ (wc -l), ลบ 44 จากมัน (-44) จากนั้นพิมพ์ทุกอย่างที่เริ่มต้นด้วยบรรทัดที่ 45 ในไฟล์

หวังว่าสิ่งนี้จะช่วยและโชคดี


สิ่งนี้ไม่ค่อยดีนักการเรียกwc -lใช้ไฟล์คุณดำเนินการสองครั้งในขณะที่sedหรือtailดำเนินการเพียงครั้งเดียว
yo '24

0

ลองนี้

head -n 42 dump.sql > tmp; cat dump.sql | grep -vxf tmp > dump.sql.new; rm tmp

หรือ,

a=$(cat dump.sql| wc -l); tail -n "$((a-42))" dump.sql > dump.sql.new


0

เนื่องจากsedความแตกต่างใน Linux และ Mac ฉันจึงตัดสินใจใช้tail -n +43 dump.sql > dump.sqlรูปแบบ

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