วิธีแยกไฟล์ที่หมายเลขบรรทัด [ปิด]


94

ฉันต้องการแยกไฟล์บันทึกความยาว 400k บรรทัดจากหมายเลขบรรทัดเฉพาะ

สำหรับคำถามนี้ขอให้เป็นตัวเลข 300k ตามอำเภอใจ

มีคำสั่ง linux ที่อนุญาตให้ฉันทำสิ่งนี้ ( ภายในสคริปต์ ) หรือไม่

ฉันรู้ว่าsplitให้ฉันแบ่งไฟล์เป็นส่วนเท่า ๆ กันไม่ว่าจะตามขนาดหรือหมายเลขบรรทัด แต่นั่นไม่ใช่สิ่งที่ฉันต้องการ ฉันต้องการ 300k แรกในไฟล์เดียวและ 100k สุดท้ายในไฟล์ที่สอง

ความช่วยเหลือใด ๆ จะได้รับการชื่นชม ขอบคุณ!

ในแง่ที่สองสิ่งนี้จะเหมาะกับไซต์ superuser หรือ serverfault มากกว่า


17
ฉันคิดว่าคำถามนี้ใช้ได้ที่นี่ คุณมีงานการเขียนโปรแกรมที่คุณกำลังพยายามแก้ไขด้วยเชลล์สคริปต์ ถ้าเป็นซับเดียวโดยใช้เครื่องมือ Unix ที่มีอยู่ทั่วไปยิ่งดีมาก!
Jim Lewis

ฉันก็คิดเหมือนกัน แต่แล้วอีกครั้งฉันไม่ได้เขียนเชลล์สคริปต์ :) ดีพบคำตอบของฉันอย่างไรก็ตาม ขอบคุณ
denormalizer

5
คำถามนี้ไม่เป็นไรไม่ต้องสงสัยเลยว่าเป็นคำถามเกี่ยวกับการเขียนโปรแกรมและก็ไม่ได้แปลมากเกินไปเช่นกัน
ปีเตอร์

9
เหตุใดจึงเป็นคำถามนอกหัวข้อ ตำรวจคิดว่าบ้ากว่าเดิม
Karel Bílek

7
แม้ว่าคำถามนี้อาจไม่ตรงประเด็น แต่ก็ได้รับการโหวตอย่างสูงและเป็นผลลัพธ์แรกในเครื่องมือค้นหาที่มีข้อความค้นหา "linux split file at line" ดังนั้นฉันขอแนะนำให้เปิดคำถามนี้อีกครั้งเพื่อให้สามารถเพิ่มคำตอบที่มีค่าอื่น ๆ ได้ หรืออย่างน้อยก็สร้างลิงค์ไปยังคำถามที่เกี่ยวข้องที่สุดใน SU
Antoine Pinsard

คำตอบ:


179
file_name=test.log

# set first K lines:
K=1000

# line count (N): 
N=$(wc -l < $file_name)

# length of the bottom file:
L=$(( $N - $K ))

# create the top of file: 
head -n $K $file_name > top_$file_name

# create bottom of file: 
tail -n $L $file_name > bottom_$file_name

นอกจากนี้ในความคิดที่สองการแยกจะใช้ได้ในกรณีของคุณเนื่องจากการแยกครั้งแรกมีขนาดใหญ่กว่าครั้งที่สอง Split จะทำให้ความสมดุลของข้อมูลเข้าในการแบ่งสุดท้ายดังนั้น

split -l 300000 file_name

จะส่งออกxaaด้วย 300k เส้นและxab100k เส้นสำหรับอินพุต 400k เส้น


ขอบคุณ. พบคำถามที่ตอบในทำนองเดียวกันที่ superuser ie ใช้หาง ฯลฯ และใช่การแยกจะใช้ได้กับตัวอย่างของฉัน แต่ตัวอย่างของฉันไม่ใช่ 100K เสมอไป
denormalizer

2
หากคุณกำลังพยายามทำสิ่งนี้บน Windows และไม่ต้องการใช้ Cygwin โครงการนี้มีเครื่องมือที่จำเป็นทั้งหมดเป็นไบนารี win32 ดั้งเดิม - unxutils.sourceforge.net
Jonathon Hill

15
ฉันจะใช้โดยtail -n +L file_name > bottom_fileที่L=K+1ไม่จำเป็นต้องวิ่งwcก่อน
Hashbrown

2
ฉันค่อนข้างจะใช้sed -n '1,1000p' test.log > top_test.log ; sed '1,1000d' test.log > bottom_test.log. IHMO ตรงไปตรงมามากกว่าและไม่จำเป็นต้องคำนวณจำนวนบรรทัดทั้งหมด นอกจากนี้ยังใช้งานได้หากมีการต่อท้ายบรรทัดระหว่างการดำเนินการของแต่ละคำสั่ง
Antoine Pinsard

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